[英]Why can glGenerateMipmap(GL_TEXTURE_2D) and setting GL_TEXTURE_MIN_FILTER to GL_LINEAR solve the black texture problem?
我尝试使用stb_image
将图像加载到 OpenGL 纹理中,代码如下:
unsigned int texture;
glGenTextures(1, &texture);
int width, height, nrChannels;
stbi_set_flip_vertically_on_load(true);
unsigned char* data = stbi_load("awesomeface.png", &width, &height, &nrChannels, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
stbi_image_free(data);
我认为这段代码可以工作,但它给了我一个黑色纹理,应该是图像。
花了很多时间解决这个问题后,我终于找到了两种解决方法:
glTexImage2D()
之后添加glGenerateMipmap(GL_TEXTURE_2D)
)glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
glBindTexture()
这两种方法中的任何一种都可以解决问题,但我不知道为什么。
谁能解释它是如何工作的?
这是由于两个默认值的组合:
GL_MIN_FILTER
的默认值为GL_LINEAR_MIPMAP_LINEAR
和GL_TEXTURE_MAX_LEVEL
的默认值为 1000。由于只存在一个纹理级别,因此纹理被认为是不完整的。
修复工作是因为它们中的任何一个都解决了其中一个问题。 生成 mipmap 解决了 mipmap 丢失的问题,同时将缩小过滤器设置为GL_NEAREST
(或为此目的的GL_LINEAR
)将过滤器设置为不需要 mipmap 的模式。
这是一个非常常见的问题,并且在 OpenGL wiki 的常见错误文章中也有提及。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.