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

时间:2012-10-02 15:11:19

标签: opengl-es glsl shader

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

这是"原创"着色器:

varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;

uniform lowp float opacity;

void main(void) {
    gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}

这是着色器在更改后的显示方式:

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);
    }
}

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:2)

你责怪转换到mediump时的性能损失,但是你还为着色器添加了分支。鉴于单个绘制调用的每个片段总是采用相同的路径,您应该只有两个不同的着色器,每个着色器都没有分支。

答案 2 :(得分:1)

分别为每个片段评估纹理坐标。然而,对于低精度,数字在每个片段基础上被量化,这意味着许多相邻片段实际上将评估到相同的量化纹理坐标。原则上,纹理坐标变量的精度必须允许比采样方向中纹理中像素/纹素的数量更多的量化步长。