OpenGL ES 2.0 / iOS:RGBA4纹理的扭曲绘制

3
我正在使用一个有效的DDS加载器来加载我的纹理,但是RGBA4格式(GL_UNSIGNED_SHORT_4_4_4_4)似乎存在问题,导致渲染结果出现偏差。我在背景上使用了相同的着色器,它可以正常工作,但使用的是RGB565格式的纹理。
以下是截图: Fail Rendering 从截图可以看出,纹理有偏差,实际应该是一个返回按钮。纹理加载也是正确的,已经调试过,OpenGL加载的代码如下:
GL.TexImage2D(All.Texture2D, 0, (int)All.Rgba, Width, Height, 0, (int)All.Rgba, All.UnsignedShort4444, image.GetData());

图像数据:

  • 大小:16402字节
  • 宽度:139像素
  • 高度:59像素

编辑

纹理是npot,但OpenGL ES 2.0应该支持。

编辑 II

看起来我有两个问题,第一个是通道不正确,第二个是纹理被扭曲了。扭曲可能是NPOT纹理和苹果的问题,因为我测试了另一张大小为128x128的图片,它没有被扭曲,但是有一些通道被交换了。

1个回答

3

你是否已经通过调用glPixelStore设置像素对齐?

默认情况下,每行应该对齐到4字节边界。

对齐参数(GL_PACK_ALIGNMENT)不取决于纹理内部格式,而是取决于源数据。在调用TexImage之前调用glPixelStore。将参数设置为1,然后学习有关像素传输参数的知识!


不,我必须为RGBA4像素格式设置什么?当然,纹理使用RGB565也可以工作,它也是16位的。 - Felix K.
内部格式不被考虑:宽度和源格式是有意义的。 - Luca
抱歉,没注意到4444是源格式!139 * 2 = 278 ... 278 % 4 != 0 - Luca
将GL_PACK_ALIGNMENT和GL_UNPACK_ALIGNMENT都设置为1会有帮助。谢谢。 - Felix K.
只有 PACK 是必要的:UNPACK 控制像素从 GPU 到 CPU 的传输。由于您正在上传纹理,因此仅设置 UNPACK 参数就足够了。此外,根据您的源格式和源范围,值为 2 就可以工作。 - Luca
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接