2016-12-03 80 views
3

我正在试图制作一个圆形的粒子,看起来像是在它的顶部闪耀着光芒。OpenGL:带片段着色器的圆斜角?

这里就是我试图让它看起来像:

particle 1

这里就是它现在的样子:

enter image description here

不是很好。

由于我使用GL_POINTS,我得到的gl_PointCoord变量,这将使事情变得更容易,但我不知道如何正确地使用它,从而导致了这个烂摊子:

varying lowp vec4 DestinationColor; 

void main(void) { 
    lowp vec2 circCoord = 2.0 * gl_PointCoord - 1.0; 
    if (dot(circCoord, circCoord) > 1.0) { 
    discard; 
    } 
    gl_FragColor = mix(DestinationColor, vec4(1, 0.5, 0.2, 1), (1.0-gl_PointCoord.t)*(max(abs(gl_PointCoord.t-0.5),abs(gl_PointCoord.s-0.5)))); // the world's worst slowest math 
} 

我会非常感谢,如果有人能够给我一点帮助,因为我受困于自己可怕的数学技能而陷入困境。

+0

您可以尝试从gl_PointCoord计算片段的法线,然后应用3D闪电计算。 – pleluron

+0

我宁愿避免3D计算,因为这是一个在iOS上运行的2D应用程序......越快越好 – MysteryPancake

回答

4

您可以进行正确的全光照计算。例如,朗伯弥散可以像下面这样工作:

const vec3 lightDir = normalize(vec3(0, 1, -0.5)); 
const vec3 ambient = ...; 
const vec3 lightDiffuse = ...; 

vec3 normal = vec3(circCoord, sqrt(1 - dot(circCoord, circCoord))); 
float c = max(dot(normal, lightDir), 0); 
gl_FracColor = ambient + lightDiffuse*c; 
+0

哇......正是我以前的样子。有一件事,它在底部而不是顶部。我会尝试改变lightDir – MysteryPancake

+0

好的,将y更改为-1就像我想要的那样工作! – MysteryPancake

+0

只是还有一个问题 - 我并不特别需要一个简单的2D斜角的全光照计算。有没有办法将这个简化为我所需要的?我想要的只是顶部的一个小梯度,因为我用这个iOS应用程序,我需要它相当快 – MysteryPancake