大型几何体GL_REPEAT上的OpenGL ES 2.0纹理扭曲

时间:2012-07-06 21:47:07

标签: iphone rendering opengl-es-2.0 texture-mapping distortion

OpenGL ES 2.0在纹理采样方面存在严重的精度问题 - 我见过similar problem的主题, 但我还没有看到这个“扭曲的OpenGL ES 2.0纹理”问题的真正解决方案。

这与纹理的图像格式或OpenGL颜色缓冲区无关,似乎是精度错误。我不知道是什么原因导致精度失败 - 看起来不仅仅是导致这种失真的几何尺寸,因为简单地缩放传递给顶点着色器的顶点位置并不能解决问题。


以下是纹理失真的一些示例:

纹理问题仅限于OpenGL ES 2.0上的小规模几何体,否则纹理采样看起来是正常的,但是颗粒效果会逐渐恶化顶点数据离XYZ原点(0,0,0)

桌面OpenGL上不会出现这些纹理问题(在Windows XP,Windows 7和Mac OS X下正常工作)

我只看到Android,iPhone或WebGL上出现此问题(类似于OpenGL ES 2.0)


所有纹理都是2的强弱,但问题仍然存在

  • 缩放顶点数据 - 顶点X Y Z位置的值在以下范围内: -65536到+65536浮点

    • 我意识到这很大,所以我尝试将顶点位置除以1024以缩小几何体并希望获得更准确的浮点精度,但这并没有解决或减少纹理扭曲问题
  • 缩放模型视图或缩放投影矩阵无济于事

  • 更改纹理过滤选项无效

    • 禁用mipmapping,或使用GL_NEAREST / GL_LINEAR不执行任何操作
    • 启用/禁用各向异性无效
    • 即使使用GL_CLAMP
    • ,仍然会出现绑扎效果
  • 将传递给顶点着色器的纹理坐标划分,然后将它们再次移回到片段着色器中的正确值,也不起作用

  • precision highp sampler2D,highp float,highp int - 在片段或顶点着色器中没有任何改变(lowp / mediump也不起作用)

我认为这个问题必须在某一点上得到解决 - 看到基于OpenGL ES 2.0的游戏已经能够呈现大规模,高度详细的几何体

1 个答案:

答案 0 :(得分:1)

这是通常的纹理图集问题。没有设置来限制纹理中间的线性插值。这就是硬件的工作原理。

您可以通过在片段程序中使用最近的滤镜纹理查找来解决此问题,该片段程序计算纹理查找模块的纹理图块大小和位置,并手动进行线性过滤。