0

我在片段着色器上做了一些工作,以允许纹理渲染和颜色渲染。进行更改后,我的所有纹理都非常像素化(就像一个旧的 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);
    }
}
4

3 回答 3

6

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

mediump至少有 11 位精度,所以应该可以达到 1024x1024 纹素(虽然是浮点类型,但如果你的纹理坐标未标准化,你可以得到像素化)

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

请注意,根据规范,这些精度是最小值——如果硬件更快的话,硬件可能会使用更高的精度。

于 2012-10-02T16:17:23.983 回答
2

您将性能损失归咎于切换到 mediump,但您还向着色器添加了分支。鉴于单个绘图调用的每个片段将始终采用相同的路径,您应该只有两个不同的着色器,每个着色器都没有分支。

于 2012-10-02T19:12:12.840 回答
1

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

于 2012-10-02T15:29:52.367 回答