7

OpenGL ES 2.0 在纹理采样方面存在严重的精度问题——我见过有类似问题的主题,但我还没有看到这个“扭曲的 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 的幂,但问题仍然存在

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

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

  • 更改纹理过滤选项无济于事

    • 禁用 mipmapping,或使用 GL_NEAREST/GL_LINEAR 什么都不做
    • 启用/禁用各向异性没有任何作用
    • 即使使用 GL_CLAMP 仍然会出现条带效应
  • 将传递给顶点着色器的纹理坐标相除,然后将它们乘回到片段着色器中的正确值,也不起作用

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

我认为这个问题必须在某一时刻得到解决——看到基于 OpenGL ES 2.0 的游戏已经能够渲染大规模、高度详细的几何图形

4

1 回答 1

1

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

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

于 2012-07-07T01:05:14.230 回答