我在片段着色器上做了一些工作,允许纹理渲染和颜色渲染。在我做了更改之后,我的所有纹理都非常像素化(就像一个旧的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);
}
}
答案 0 :(得分:5)
lowp
只有大约8位精度最小,所以如果你的纹理是128x128或更大,你会开始看到神器,如果你的纹理大于256x256,一些纹素将完全丢失(你描述的严重的像素化。)
mediump
具有至少11位的精度,因此应该精细到1024x1024纹素(尽管是浮点类型,如果纹理坐标未标准化,则可以获得像素化)
highp
具有至少24位的精度(与IEEE单精度浮点数相同),因此更好。
请注意,根据规范,这些精度是最小值 - 如果速度更快,硬件可以使用更高精度。
答案 1 :(得分:2)
你责怪转换到mediump时的性能损失,但是你还为着色器添加了分支。鉴于单个绘制调用的每个片段总是采用相同的路径,您应该只有两个不同的着色器,每个着色器都没有分支。
答案 2 :(得分:1)
分别为每个片段评估纹理坐标。然而,对于低精度,数字在每个片段基础上被量化,这意味着许多相邻片段实际上将评估到相同的量化纹理坐标。原则上,纹理坐标变量的精度必须允许比采样方向中纹理中像素/纹素的数量更多的量化步长。