如何使用偏离中心点的度数创建着色器以进行遮罩?

时间:2011-07-31 16:14:23

标签: opengl-es glsl shader opengl-es-2.0

我有点失落,这与another question有点关系我曾经问过片段着色器,但超出了它。

我有一个正交场景(虽然这可能不相关),这里绘制的场景为黑色,我有一个使用着色器绘制的广告牌精灵,我用红色显示。我有一个观点,我知道并定义自己, A ,由蓝点表示,在2d坐标空间的某个x,y坐标处。 (屏幕的左下角是原点)。我需要以编程方式掩盖红色广告牌,我指定0%到100%,0%完全完整,100%完全屏蔽。我可以将0-100%(0到1.0)传递到着色器,或者我可以预先计算一个角度,任何解决方案都可以。

Here you can see the scene drawn with '0%' masking (在这里你可以看到用'0%'掩盖绘制的场景)

因此,当我设置“15%”时,我希望显示以下内容:

15% (在这里你可以看到用'15%'掩盖绘制的场景)

当我设置“45%”时,我想要显示以下内容:

45% (在这里你可以看到用'45%'掩盖绘制的场景)

以下是“80%”的例子:

80%

我认为,一般的想法是传入一个统一的'A'vec2d,并且在片段着色器中我确定片段是否在从“A”到屏幕底部的区域内,到一条线是正确的角度偏移从那里顺时针。如果在该区域内,则丢弃该片段。 (放弃比将alpha设置为0.0或1.0更合理,如果保持,对吗?)

但我怎么能真正实现这个?我不明白如何根据着色器实现该算法。 (我正在使用OpenGL ES 2.0)

2 个答案:

答案 0 :(得分:3)

对此的一个解决方案是计算gl_FragCoord(我希望ES 2.0下存在!)和点(必须确保点在屏幕坐标中)和使用{{3}之间的差异。函数有两个参数,给你一个角度。如果角度不是您喜欢的某个值(大于最小值且小于最大值),则删除该片段。

当然,杀死碎片并不是最有效的方法。 (更复杂的)三角形解决方案可能仍然更快。

编辑:
为了更好地解释“不是最精确的事情”,考虑杀死片段仍会导致片段着色器运行(它之后只丢弃结果)干扰早期深度/模板片段拒绝。 /> 构建像whoplisp建议的三角扇是更多的工作,但不会处理任何不可见的碎片,不会干扰深度/模板拒绝,并且在某些情况下也可能看起来更好(例如MSAA)。

答案 1 :(得分:2)

为什么不在红色矩形的顶部画一些黑色三角形?