Opengl es 如何使用从中心点的度偏移创建着色器以遮罩?

Opengl es 如何使用从中心点的度偏移创建着色器以遮罩?,opengl-es,glsl,shader,opengl-es-2.0,Opengl Es,Glsl,Shader,Opengl Es 2.0,我有点迷路了,这和我问过的片段着色器有点关系,但超出了范围 我有一个正交场景(虽然可能不相关),这里的场景绘制为黑色,我有一个广告牌精灵,我使用着色器绘制,我用红色显示。我知道并定义了自己的一个点,a,由蓝点表示,在二维坐标空间的某个x,y坐标处。(屏幕左下角为原点)。我需要以编程方式屏蔽红色广告牌,其中我指定0%到100%,0%是完全完整的,100%是完全屏蔽的。我可以将0-100%(0到1.0)传递到着色器,或者我可以预计算角度,任何一种解决方案都可以 (此处可以看到使用“0%”遮罩绘制的

我有点迷路了,这和我问过的片段着色器有点关系,但超出了范围

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

(此处可以看到使用“0%”遮罩绘制的场景)

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

(在这里,您可以看到使用“15%”遮罩绘制的场景)

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

(在这里,您可以看到使用“45%”遮罩绘制的场景)

这里有一个“80%”的例子:

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


但我如何才能真正做到这一点??我不明白如何用着色器实现该算法。(我正在使用OpenGL ES 2.0)

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

一个解决方案是计算
gl\u FragCoord
(我希望在ES 2.0下存在!)和点(必须确保点在屏幕坐标中)之间的差异,并使用带有两个参数的函数,给你一个角度。如果角度不是你喜欢的值(大于最小值,小于最大值),杀死碎片

当然,杀死碎片并不是最有效的方法。一个(稍微复杂一些的)三角形解可能会更快

编辑:
为了更好地解释“不完全是最有性能的东西”,认为杀戮碎片仍然导致碎片着色器运行(它只丢弃结果后),并干扰早期深度/模板碎片拒绝。
像whoplisp建议的那样构建一个三角形扇子需要更多的工作,但不会处理任何不可见的碎片,不会干扰深度/模板拒绝,在某些情况下也可能看起来更好(例如MSAA)。

因为我说的不是黑色;黑色代表绘制的场景您可以使用模具测试来选择性地绘制红色矩形。嗯,通过对单位圆进行镶嵌,这似乎是可能的,但如果我这样做,我认为有更好的解决方案,不使用模具缓冲区。我想避开单位苔丝的路线,不过我想谢谢戴蒙。您能更清楚地了解我将在atan中使用哪两个参数吗?另外,我如何设置它,使我获得的度数结果与(0,-1,0)相对应,即从A“指向下”的线?我的三角/几何也很弱;你能解释一下为什么atan在这里是正确的选择吗?这个函数有两个版本,一个采用单个y-over-x值,另一个采用y和x值(相当于C
atan2
函数)。这就是我指的那个(尽管你也可以使用另一个)。这两个参数是vec2的.y和.x(gl_FragCoord.xy-A.xy)。注意它是(y,x),不是(x,y)。好的,这是有意义的。看起来我必须弄清楚我的答案在哪个象限才能得到>180度的答案,我还没有想好如何实现这一点,但我可以清楚地看到,可以将我的输入/输出调整为atan2,以得到相对于0,-1,0而不是1,0,0的答案。。当我有机会尝试时,我会接受的。这确实有效,谢谢。为了引用0,-1并处理斯坦不连续性问题,我只在着色器if(从-pi/2到-pi)、else if(从pi到0)、else if(从0到-pi/2)中进行了分段检查,然后在那里进行评估以确定放弃。效果很好。当然,如果需要的话,下一步就是将单位圆细分为suggested@genpfault您想解释一下,当问题完全适用于两个APIsI时,为什么您总是从包含opengl中重新标记任何opengl es相关问题?我维护的是“桌面opengl 1.0-4.1”(
opengl
tag)与“opengl es 1.1/2.0”(
opengles
tag)区别。因为你特别提到了你对ES 2.0的使用,我不认为有必要使用
opengl
标记。请随意还原编辑,我不会再修改它了。@genpfault我很欣赏你的观点,因为看到成堆的可可触控等问题被标记为objective-c,而它们却什么都没有,这让我简直疯了但是从我的角度来看,我把所有与
opengl
相关的东西都标记为
opengl
,即使我使用的是ES实现——它为答案提供了一个更广阔的网络,分类也很有意义。标记为
*-ES..
我只会在这是一个特定于该实现的问题时才这么做。我认为这很少问题实际上是(也许是设计q)。感谢垃圾收集,祝你好运