跳到主要内容
← Grass

Grass

Grass - Bending

shader-learning 自学第 2 课:Grass - Bending

实时渲染 · 网格 GLSL

第 2 课:Grass - Bending

实现

uniform float iTime;

attribute int index;

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

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

  return p;
}

void main() {
  float h = float(index / 2) / 9.0;
  float sideX = mod(float(index), 2.0) * 2.0 - 1.0;
  float bend = cos(iTime) * 0.5;

  vec2 curve = bezier(
    vec2(0.0, 0.0),
    vec2(0.0, 0.5),
    vec2(sin(bend), cos(bend)),
    h
  );

  float dw = mix(0.05, 0.0, h * h);
  vec3 pos = vec3(curve.x + sideX * dw, curve.y, 0.0);

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