禁用mipmapping时的空白纹理?

时间:2011-02-23 17:39:17

标签: iphone memory-management opengl-es textures mipmaps

我不掌握OpenGL的所有细微之处,如果我的问题不够精确,那就很抱歉

在iPhone上我加载了像这样的纹理(png图像)

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, iTextureSize.width, iTextureSize.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_FILTER, GL_NEAREST);

哪个效果很好,但我注意到这个分配的尺寸恰好是textureData的两倍。 我在论坛上看到这可能是由mipmaping造成的,所以我试图把它关掉 评论glTexParameteri线但是我的纹理是空白的。

这是我的显示代码中的纹理加载参数问题吗? 我的显示代码是这样的

glTexCoordPointer(2, GL_FLOAT, 0, texture);
glVertexPointer(DIMENSION,  GL_SHORT,  0, iVertex);
glBindTexture(GL_TEXTURE_2D, (GLuint)textureID);
glDrawArrays(GL_TRIANGLE_FAN,  0, iVertexCount);

3 个答案:

答案 0 :(得分:2)

现在您已禁用mipmaps,您是否尝试禁用纹理重复?

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

如果您的纹理宽度或高度是一个不是2的幂的值,那么您将陷入“非二次幂纹理”(NPOT),这是受iPhone限制处理的,请参阅:

Rendering to non-power-of-two texture on iPhone

答案 1 :(得分:1)

注释掉两个纹理参数行可启用MIP映射。由于您只上传了一个级别的纹理,因此所有其他级别都是空白的。这就是你后来什么都没看到的原因。

通过什么方式你得出的结论是你要分配两倍大小的textureData,你如何得出这是一个错误的结论?它取决于GL驱动程序如何在内部分配内存以及它在何处缓存它想要的内容。没有理由认为double是不正确的,特别是如果你将视频RAM添加到主RAM。

此外,存储MIP地图会使您的整体存储需求增加三分之一,而不是100%。

答案 2 :(得分:-1)

如果您没有设置过滤器,则最终会使用GL_NEAREST_MIPMAP_LINEAR的默认最小过滤器,这需要完整的mipmap。

相关问题