opengl 如何进行无分支丢弃?

bwitn5fc  于 2024-01-07  发布在  其他
关注(0)|答案(1)|浏览(192)

我有一个相当基本的片段着色器,它可以从纹理中采样,并根据采样改变指定的固定颜色。如果我从纹理中采样,我会做一个alpha检查,并丢弃低alpha值。有没有办法让这个过程无分支?

  1. #version 460 core
  2. layout (location = 0) out vec4 FragColor;
  3. uniform vec4 color;
  4. uniform sampler2D tex;
  5. uniform bool useTex;
  6. in vec2 texCoords;
  7. void main() {
  8. vec4 tex = texture(tex, texCoords);
  9. if(useTex && tex.a < 0.1) { discard; }
  10. vec4 outColor = mix(color, color * tex, int(useTex));
  11. FragColor = outColor;
  12. }

字符串

628mspwn

628mspwn1#

我建议总是绑定一个纹理,至少是一个颜色为(1,1,1,1)的1x1纹理。使用这种方法,你可以完全省略useTex,着色器也简单得多:

  1. #version 460 core
  2. layout (location = 0) out vec4 FragColor;
  3. uniform vec4 color;
  4. uniform sampler2D tex;
  5. in vec2 texCoords;
  6. void main()
  7. {
  8. vec4 outColor = color * texture(tex, texCoords);
  9. if (outColor.a < 0.1)
  10. discard;
  11. FragColor = outColor;
  12. }

字符串
如果可以使用Blending而不是discard,着色器可以进一步简化:

  1. #version 460 core
  2. layout (location = 0) out vec4 FragColor;
  3. uniform vec4 color;
  4. uniform sampler2D tex;
  5. in vec2 texCoords;
  6. void main()
  7. {
  8. FragColor = color * texture(tex, texCoords);
  9. }

展开查看全部

相关问题