第 3 课:Grass - 3D Blade
实现
uniform float iTime;
attribute int index;
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;
}
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 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
);
float dw = mix(0.1, 0.0, h * h);
vec3 pos = vec3(curve.x + sideX * dw, curve.y, curve.z);
gl_Position = projectionMatrix * viewMatrix * vec4(pos, 1.0);
}