OpenGL:带片段着色器的圆形斜面?
OpenGL: Circle bevel with fragment shader?
我正在尝试制作一个圆形粒子,看起来它的顶部有一束光。
这是我试图让它看起来像的东西:
这是目前的样子:
因为我使用的是 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
}
非常感谢任何帮助,因为我的数学技能很差,所以我被困住了。
你可以做一个正确的全光照计算。例如,朗伯扩散会像这样工作:
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;
我正在尝试制作一个圆形粒子,看起来它的顶部有一束光。
这是我试图让它看起来像的东西:
这是目前的样子:
因为我使用的是 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
}
非常感谢任何帮助,因为我的数学技能很差,所以我被困住了。
你可以做一个正确的全光照计算。例如,朗伯扩散会像这样工作:
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;