不得不改变纹理的精度,为什么?

Mau*_*uin 0 shader opengl-es glsl

我在片段着色器上做了一些工作,允许纹理渲染和颜色渲染.在我做了更改后,我的所有纹理都非常像素化(就像一个旧的8位游戏),我不得不提高纹理坐标的精度到中等.这也给我带来了性能影响.我只是不明白为什么我突然不得不首先改变精度.

这是"原始"着色器:

varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;

uniform lowp float opacity;

void main(void) {
    gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
Run Code Online (Sandbox Code Playgroud)

这是着色器在更改后的样子:

varying mediump vec2 TexCoordOut;
uniform sampler2D Texture;

uniform lowp vec4 color;
uniform lowp float opacity;
uniform int colorRender;

void main(void) {
    if (colorRender == 1)
    {
        gl_FragColor = color;
    } else {
        gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*odd 5

lowp 只有大约8位精度最小,所以如果你的纹理是128x128或更大,你会开始看到神器,如果你的纹理大于256x256,一些纹素将完全丢失(你描述的严重的像素化).

mediump 具有至少11位的精度,因此应该精细到1024x1024纹素(尽管是浮点类型,如果纹理坐标未标准化,则可以获得像素化)

highp 具有至少24位的精度(与IEEE单精度浮点相同),因此更好.

请注意,根据规范,这些精度是最小值 - 如果速度更快,硬件可以使用更高精度.