OpenGL ES 2.0 在纹理采样方面存在严重的精度问题——我见过有类似问题的主题,但我还没有看到这个“扭曲的 OpenGL ES 2.0 纹理”问题的真正解决方案。
这与纹理的图像格式或 OpenGL 颜色缓冲区无关,似乎是精度错误。我不知道具体是什么导致精度失败 - 似乎不仅仅是几何体的大小导致了这种失真,因为简单地缩放传递给顶点着色器的顶点位置并不能解决问题。
以下是纹理失真的一些示例:
扭曲纹理(在 OpenGL ES 2.0 上):http: //i47.tinypic.com/3322h6d.png
纹理通常的样子(也在 OpenGL ES 2.0 上):http: //i49.tinypic.com/b4jc6c.png
纹理问题仅限于 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 的游戏已经能够渲染大规模、高度详细的几何图形