opengl es 纹理不是二的幂(iphone)

Posted

技术标签:

【中文标题】opengl es 纹理不是二的幂(iphone)【英文标题】:opengl es texture not power of two (iphone) 【发布时间】:2011-05-14 20:45:43 【问题描述】:

我想将尺寸为 200 像素(宽)x 80 像素(高)的纹理绘制到 openGL 中的一个矩形(宽 200 像素,高 80 像素)。 由于 openGL ES 1.1 中的纹理必须具有二次幂,我想加载一个尺寸为 256px x 128px 的图像,其中包含左上角的原始 200px x 80px 图像,其余部分留空。 如何使用 glTexSubImage2D 从 256px x 128px 纹理中获取感兴趣的部分? 我不知道如何使用最后一个参数(即像素)正确地提供该函数。

此外,我读到我必须以某种方式使用 glPixelStorei?

谁能给我一个示例代码的sn-p,好吗? 我一直在努力解决这个问题,但我就是不明白。

顺便说一句,我也尝试不使用 glTexSubImage2D,而是在 0...1 之间调整 TextureCoords,但这并没有奏效。

【问题讨论】:

在某些情况下,您确实可以在大多数 ios 设备上使用非二次幂纹理。在此处查看详细信息:***.com/questions/4760174/… iPhone 3G 兼容非 POT 纹理还是只兼容 iPhone3GS 以上?谢谢! 3GS 以上(新交所平台上的一切)。兼容性图表和详细信息:developer.apple.com/library/ios/#documentation/3DDrawing/… 【参考方案1】:

您将不可避免地必须从 0…1 中选择一个子范围作为纹理坐标。 glTexSubImage2D 仅(重新)定义纹理的一部分,同时保持总尺寸不变。

计算正确的子范围值有点不直观:假设您的总纹理为 8 像素宽,其中 3…6 像素具有实际内容,那么纹理坐标映射如下:

        2/8             6/8 
 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
 ^                               ^
0.0                             1.0

所以要使用的纹理坐标是:

(t0 - 1)/N … (t1)/N ; t0, t1, N 以像素为单位。

如果您想在参数 tau 上处理 0…1 范围内的子纹理,则公式为

w := t1 - t0 u = (t0 - 1)/N + w * tau

【讨论】:

以上是关于opengl es 纹理不是二的幂(iphone)的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 应用程序中奇怪的 OpenGL ES 行为

iPhone OpenGL ES 2.0 奇怪的图案在 COLLADA 文件中的球体上渲染纹理

OpenGL ES 渲染到纹理,然后绘制纹理

OpenGL ES 2.0 - iOS - 使用 FBO 渲染到纹理

在 OpenGL ES 2.0 中渲染到纹理时的抗锯齿

绘制分层 OpenGL ES 内容的最佳方式是啥?