繁体   English   中英

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

[英]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);

我认为这段代码可以工作,但它给了我一个黑色纹理,应该是图像。

花了很多时间解决这个问题后,我终于找到了两种解决方法:

  1. glTexImage2D()之后添加glGenerateMipmap(GL_TEXTURE_2D) )
  2. 在 glBindTexture() 之后添加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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM