为什么glGenerateMipmap(GL_TEXTURE_2D)并将GL_TEXTURE_MIN_FILTER设置为GL_LINEAR可以解决黑色纹理问题?

bvk5enib  于 2022-09-26  发布在  其他
关注(0)|答案(1)|浏览(187)

我曾尝试使用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)

这两种方法都能解决问题,但我不知道为什么。

有谁能解释一下它是怎么工作的吗?

knpiaxh1

knpiaxh11#

它应该是两个缺省值的组合:

  • GL_MIN_FILTER的默认值为GL_LINEAR_MIPMAP_LINEAR
  • GL_TEXTURE_MAX_LEVEL的默认值为1000。

由于只存在一个纹理级别,因此该纹理被视为不完整。

这些修复之所以有效,是因为它们中的任何一个都解决了其中一个问题。生成mipmap解决了mipmap丢失的问题,同时将缩小过滤器设置为GL_NEAREST(或用于该目的的GL_LINEAR)将过滤器设置为不需要mipmap的模式。

这是一个非常常见的问题,OpenGL维基的常见错误文章中也提到了这一点。

相关问题