我曾尝试使用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);
我认为这个代码可以工作,但它给我一个黑色的纹理,这应该是图像。
在花了很多时间解决这个问题后,我终于找到了两种方法来解决它:
1.在glTexImage2D()
之后添加glGenerateMipmap(GL_TEXTURE_2D)
1.在glBindTexture()
之后添加glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
这两种方法都能解决问题,但我不知道为什么。
有谁能解释一下它是怎么工作的吗?
1条答案
按热度按时间knpiaxh11#
它应该是两个缺省值的组合:
GL_MIN_FILTER
的默认值为GL_LINEAR_MIPMAP_LINEAR
,GL_TEXTURE_MAX_LEVEL
的默认值为1000。由于只存在一个纹理级别,因此该纹理被视为不完整。
这些修复之所以有效,是因为它们中的任何一个都解决了其中一个问题。生成mipmap解决了mipmap丢失的问题,同时将缩小过滤器设置为
GL_NEAREST
(或用于该目的的GL_LINEAR
)将过滤器设置为不需要mipmap的模式。这是一个非常常见的问题,OpenGL维基的常见错误文章中也提到了这一点。