OpenGL:带片段着色器的圆形斜角?

Mys*_*ake 4 opengl-es fragment-shader ios opengl-es-2.0

我正在尝试制作一个圆形粒子,看起来它的顶部有光。

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

粒子 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
}
Run Code Online (Sandbox Code Playgroud)

我非常感谢任何帮助,因为我的数学技能很差,所以我被困住了。

ybu*_*ill 5

您可以进行正确的完整照明计算。例如,朗伯漫反射的工作方式如下:

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;
Run Code Online (Sandbox Code Playgroud)

  • `P != circCoord` 因为 `P` 必须是一个 3d 向量,而 `circCoord` 是圆内的 2d 向量。所以要计算点的 3d 坐标,我们需要根据它的 `x` 和 `y` 找到它的 `z` 坐标。半径为 1 的球体的方程为 `x*x + y*y + z*z = 1`,因此 `z = sqrt(1 - (x*x + y*y))`。而这正是我所做的。 (2认同)
  • 是的,半径为 1,因为这是 OP 定义它的方式:`dot(circCoord, circCoord) > 1.0` (2认同)