下面是一个 GLSL 片段着色器,如果给定的纹理坐标在框内,则输出纹理像素,否则输出颜色。这只是感觉很愚蠢,必须有一种方法可以在不分支的情况下做到这一点?
uniform sampler2D texUnit;
varying vec4 color;
varying vec2 texCoord;
void main() {
vec4 texel = texture2D(texUnit, texCoord);
if (any(lessThan(texCoord, vec2(0.0, 0.0))) ||
any(greaterThan(texCoord, vec2(1.0, 1.0))))
gl_FragColor = color;
else
gl_FragColor = texel;
}
下面是一个没有分支的版本,但是感觉还是很笨拙。“纹理坐标夹紧”的最佳实践是什么?
uniform sampler2D texUnit;
varying vec4 color;
varying vec4 labelColor;
varying vec2 texCoord;
void main() {
vec4 texel = texture2D(texUnit, texCoord);
bool outside = any(lessThan(texCoord, vec2(0.0, 0.0))) ||
any(greaterThan(texCoord, vec2(1.0, 1.0)));
gl_FragColor = mix(texel*labelColor, color,
vec4(outside,outside,outside,outside));
}
我将纹素夹在标签为的区域中——在这种情况下,纹理 s & t 坐标将介于 0 和 1 之间。否则,我会在没有标签的地方使用棕色。
请注意,我还可以构建代码的分支版本,在不需要时不执行纹理查找。这会比总是执行纹理查找的非分支版本更快吗?也许是时候进行一些测试...