2011-02-23 27 views
0

我不掌握的OpenGL的所有微妙很抱歉,如果我的问题是不够的停用mipmaping时出现空白纹理?

在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); 
+0

你是什么意思'分配恰好两倍的textureData大小?上传纹理后,您还可以释放内存textureData点。 glTexImage创建一个完整的副本。 – datenwolf

+0

我已经释放textureData但是glTexImage2D分配了两次纹理数据的大小 – CodeFlakes

回答

-1

如果将过滤条件设置你结束了默认分钟GL_NEAREST_MIPMAP_LINEAR过滤器,这需要一套完整的贴图的。

+1

纹理参数一旦设置就会应用到纹理对象。设置纹理参数与提供数据无关。 – datenwolf

+0

是的,你说得对。编辑。 – genpfault

1

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

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

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

+0

是的,我知道我应该有1/3以上,但在我的情况下,我有两次。我试图尽量减少我的应用程序使用的内存,这就是为什么我对glTextImage2D行为感兴趣。我只是显示全屏png,所以我想我不需要mipmap吗? – CodeFlakes

+0

不,您是对的 - 当您经常缩放纹理时,mip映射会同时减少混叠和内存带宽需求。我还不清楚你从哪里得到两倍,但它可能只是一个RAM副本+一个VRAM副本,VRAM用于GPU,RAM副本是例如保持快速访问,除非发生低内存警告。 iPhone根据他们的需要在两台设备之间分配相同的物理内存,因此您可以最终将两个商店计入您的总计。 – Tommy

2

现在你已经禁用了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的幂的值,你落入“非幂的两个纹理”(NPOT),这是与iPhone上的限制处理,见:

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

+0

好的是没有解决这个确切的问题,但它解决了另一个问题,我非常感谢你。 – CodeFlakes