Opengl es 在片段着色器中更改纹理坐标时会产生像素化结果

Opengl es 在片段着色器中更改纹理坐标时会产生像素化结果,opengl-es,shader,opengl-es-2.0,Opengl Es,Shader,Opengl Es 2.0,我试图改变碎片着色器中的纹理坐标。 精度设置为中等。 它在某些设备上工作,但在某些(更便宜的)设备上会导致严重的像素化。 我假设这是一个精度问题,但它很奇怪,因为我已经将默认值设置为“介质”,所有设备上都应该可以使用它。有什么想法吗?谢谢你抽出时间 +"mediump vec2 coords=v_TexCoordinate; \n" +"coords+=0.1; \n" mediump仅在规范中定义为最小允许精度。有一些设备可以将mediump实现为highp(即或多或少的单精度32位

我试图改变碎片着色器中的纹理坐标。 精度设置为中等。 它在某些设备上工作,但在某些(更便宜的)设备上会导致严重的像素化。 我假设这是一个精度问题,但它很奇怪,因为我已经将默认值设置为“介质”,所有设备上都应该可以使用它。有什么想法吗?谢谢你抽出时间

+"mediump vec2 coords=v_TexCoordinate;   \n"
+"coords+=0.1;   \n"

mediump仅在规范中定义为最小允许精度。有一些设备可以将mediump实现为highp(即或多或少的单精度32位浮点)

可能还有其他设备真正具有mediump(类似于半精度浮点)和单独的硬件highp,但使用一些启发式方法来注意这是一个纹理坐标,并决定您最好使用更高的精度

其他设备仍然可能会将琐碎的tex坐标修改移动到顶点着色器,并将使用顶点着色器输出的纹理坐标在片段着色器执行之前预取texel(从而完全避免片段着色器的拙劣精度)

所以,就因为您到处都要求mediump,所以您只能在设备的一个子集上重新编程精度问题也就不足为奇了


在修复方面-根据您在问题中包含的内容,您可以在顶点着色器上进行tex坐标修改。

从您提到的设备判断,您确定使用的是OpenGL而不是OpenGL ES吗?另外:包括图像和a可能会有帮助。是的,opengl es2.0非常感谢您的帮助回复。非常感谢您的全面回复。事实上,我无法通过将mod移动到顶点着色器来修复它,因为我实际上是通过采样纹理来修改tex坐标(以获得涟漪水效果),我发布了上述更简单的代码,以便更容易地显示问题。我很感激你带着领带回复。在这种情况下,你可能会有更好的运气,确保纹理坐标保持在0附近,只要纹理坐标不偏离原点太远,mediump对于纹理坐标来说就足够了。因此,如果水效果位于代码生成的平面上,只需对其进行足够的细分,即可将所有UV转换为-1和+1之间,问题可能会消失。如果是在艺术家生成的网格上,那么艺术家应该能够进行修复(假设导出过程不够聪明,无法尝试重新缝合顶点)。