我怎么能告诉片段着色器不写一个特定的像素?

在WebGL中,我希望发送一个屏幕空间四边形,通过片段着色器进行处理,但片段着色器只能在特定条件下写出一个像素(例如说,它在一个圆圈内,或者像素属于由曲线方程定义的半空间的正面)。

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

我知道这可以通过使用各种其他方法来实现,比如alpha混合,先渲染,然后把背景颜色放在不想画像素的地方,或者用深度或者模板缓冲区来做一些技巧。 我也知道我可以创建一堆几何graphics来匹配我想渲染的东西。

有没有办法让片段着色器select不写一个像素?

是的,你可以discard在片段着色器,以避免写像素。 这里是我从Google挖掘的一个随机的例子 。

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

你可能对这个相关的问题感兴趣, 关于discard的性能和这个在SO上的问题。

我不知道WebGL是否支持这个function。 如果不是,你需要回到你的一个建议(比如alpha混合;我认为这将是最直接的)。

discard声明派上用场。

你没有太多的关于你的决定path,所以我会提供一个简单的纹理查找的例子:

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

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