OpenGL: круговой скос с фрагментным шейдером?


Я пытаюсь сделать круглую частицу, которая выглядит так, как будто на ее вершине горит свет.

Вот что я пытаюсь сделать, чтобы это выглядело так:

частица 1

И вот как это выглядит в настоящее время:

Введите описание изображения здесь

Не очень хорошо.

Поскольку я использую 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 3

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;