如何告诉片段着色器不写特定像素?


11

在WebGL中,我想发送一个由片段着色器处理的屏幕空间四边形,但是让片段着色器仅在特定条件下写出一个像素(例如……它在一个圆圈内,或者像素属于由曲线方程式等定义的半空间的正侧)。

片段着色器中是否可以说“不写像素”?

我知道这可以使用其他各种方法来完成,例如Alpha混合,先渲染然后将其放置在不想绘制像素的背景颜色上,或者对深度或模板缓冲区进行一些技巧。我也知道我可以创建一堆几何体来匹配我要渲染的几何体。

是否有办法使片段着色器选择根本不写像素?

Answers:


10

是的,您可以discard在片段着色器中避免写入像素。这是我从Google挖来的一个随机示例

请注意,这实际上可能不会停止片段着色器的处理(因为GPU倾向于处理块中的片段;仅丢弃块中所有片段会放弃处理)。但是片段不会写到输出中,这基本上就是您想要的。

您可能对与此有关的性能discard以及SO上的这一性能感兴趣。

我不知道WebGL是否支持此功能。如果不是这样,则需要回落您的建议之一(例如Alpha混合;我认为那是最简单的方法)。


3

discard声明派上用场了。

您没有对决策路径说太多,所以我将提供一个使用简单纹理查找的示例:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(这是我在学习alpha混合之前编写的一些示例代码。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.