跳到主要内容
← Grass

Grass

Grass - Blade Normal

shader-learning 自学第 8 课:Grass - Blade Normal

实时渲染 · 网格 GLSL

第 8 课:Grass - Blade Normal

实现

uniform float iTime;

attribute int index;

varying vec3 n;

vec3 bezier3D(vec3 p0, vec3 p1, vec3 p2, float t) {
    float u = 1.0 - t;
    float tt = t * t;
    float uu = u * u;

    vec3 p = uu * p0;
    p += 2.0 * u * t * p1;
    p += tt * p2;

    return p;
}

vec3 bezierGradient3D(vec3 p0, vec3 p1, vec3 p2, float t) {
    float u = 1.0 - t;
    vec3 gradient = 2.0 * u * (p1 - p0) + 2.0 * t * (p2 - p1);
    return gradient;
}

void main() {
  int   localIndex = index % 20;
  float h = float(localIndex / 2) / 9.0;
  float sideX = mod(float(localIndex), 2.0) * 2.0 - 1.0;
  float sideZ = (index / 20 == 1) ? 1.0 : -1.0;
  float bend = sin(iTime) * 1.5;

  vec3 curve = bezier3D(
    vec3(0.0, 0.0, 0.0),
    vec3(0.0, 0.5, 0.0),
    vec3(0.0, cos(bend), sin(bend)),
    h
  );

   vec3 grad = bezierGradient3D(
    vec3(0.0, 0.0, 0.0),
    vec3(0.0, 0.5, 0.0),
    vec3(0.0, cos(bend), sin(bend)),
    h
  );

  vec3 tangent = grad;
  n = normalize(sideZ * vec3(0.0, tangent.z, -tangent.y));

  vec3 pos = curve;
  pos.x += sideX * mix(0.1, 0.0, h * h);

  gl_Position = projectionMatrix * viewMatrix * vec4(pos, 1.0);
}