问题描述
我有一个相当基本的片段着色器,它可以从纹理中采样并根据样本更改指定的固定颜色。如果我从纹理中采样,我会进行 alpha 检查并丢弃低 alpha 值。有没有办法让这个过程无分支?
#version 460 core
layout (location = 0) out vec4 FragColor;
uniform vec4 color;
uniform sampler2D tex;
uniform bool useTex;
in vec2 texCoords;
void main() {
vec4 tex = texture(tex,texCoords);
if(useTex && tex.a < 0.1) { discard; }
vec4 outColor = mix(color,color * tex,int(useTex));
FragColor = outColor;
}
解决方法
我建议始终绑定纹理,至少是 1x1 纹理与颜色 (1,1,1)。使用这种方法,您可以完全省略 useTex
,并且着色器要简单得多:
#version 460 core
layout (location = 0) out vec4 FragColor;
uniform vec4 color;
uniform sampler2D tex;
in vec2 texCoords;
void main()
{
vec4 outColor = color * texture(tex,texCoords);
if (outColor.a < 0.1)
discard;
FragColor = outColor;
}
如果您可以使用 Blending 而不是 discard
,则可以进一步简化着色器:
#version 460 core
layout (location = 0) out vec4 FragColor;
uniform vec4 color;
uniform sampler2D tex;
in vec2 texCoords;
void main()
{
FragColor = color * texture(tex,texCoords);
}