OpenGL: круговой скос с фрагментным шейдером?
Я пытаюсь сделать круглую частицу, которая выглядит так, как будто на ее вершине горит свет.
Вот что я пытаюсь сделать, чтобы это выглядело так:
И вот как это выглядит в настоящее время:
Не очень хорошо.
Поскольку я использую 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
}
Я бы так и сделал. очень признателен, если кто-то может помочь мне с этим, так как я застрял из-за моих собственных ужасных математических навыков.
1 ответ:
Вы можете сделать правильный полный расчет освещения. Например, ламбертовская диффузия будет работать следующим образом:
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;