【问题标题】:Blank texture when disabling mipmaping?禁用mipmapping时出现空白纹理?
【发布时间】:2011-02-26 15:45:05
【问题描述】:

我没有掌握 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);

效果很好,但我注意到它分配的大小正好是纹理数据的两倍。 我在论坛上读到这可能是由 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);

【问题讨论】:

  • 你所说的“分配正好是纹理数据大小的两倍”是什么意思?您也可以在上传纹理后释放纹理数据指向的内存。 glTexImage 创建一个完整的副本。
  • 我已经释放了 textureData 但是 glTexImage2D 分配了两倍于 textureData 的大小

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


【解决方案1】:

既然你已经禁用了 mipmap,你是否尝试过禁用纹理重复?

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 的幂的值,您将陷入“非 2 的幂纹理”(NPOT),这在 iPhone 上会受到限制,请参阅:

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

【讨论】:

  • 好吧,它并没有解决这个确切的问题,但它解决了我遇到的另一个问题,非常感谢。
【解决方案2】:

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

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

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

【讨论】:

  • 是的,我知道我应该多 1/3,但就我而言,我有两次。我试图最小化我的应用程序使用的内存,这就是我对 glTextImage2D 行为感兴趣的原因。我只是显示全屏 png,所以我想我不需要 mipmap 吧?
  • 不,你是对的——当你经常缩小纹理时,mip 映射可以同时减少锯齿和内存带宽需求。我仍然不清楚你从哪里得到双倍,但它可能只是一个 RAM 副本 + 一个 VRAM 副本,VRAM 用于 GPU,RAM 中的副本是例如保留以供快速访问,除非并且直到出现低内存警告。 iPhone 根据需要在两个设备之间划分相同的物理 RAM,因此您最终可能会将两个存储都计入您的总数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
相关资源
最近更新 更多