第 7 课:Grass - Wind with Noise
实现:这题牛头不对马嘴,之后回来检查什么意思
实现
uniform float iTime;
uniform sampler2D iChannel0;
attribute int index;
out float vH;
out vec3 vNormal;
out float vX;
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;
}
vec2 random2(vec2 st){
float d1 = dot(st, vec2(12.3, 32.1));
float d2 = dot(st, vec2(45.6, 65.4));
st = vec2(d1, d2);
return fract(sin(st) * 78.9) * 2.0 - 1.0;
}
float random(float x) {
float r = fract(sin(x * 12.34) * 1234.5678);
return r * 2.0 - 1.0;
}
mat3 rotationYMatrix(float angle) {
float cosAngle = cos(angle);
float sinAngle = sin(angle);
return mat3(
vec3(cosAngle, 0, -sinAngle),
vec3(0, 1, 0),
vec3(sinAngle, 0, cosAngle)
);
}
mat3 rotationXMatrix(float angle) {
float cosAngle = cos(angle);
float sinAngle = sin(angle);
return mat3(
1.0, 0, 0,
0, cosAngle, sinAngle,
0, -sinAngle, cosAngle
);
}
float noise(vec3 st) {
vec2 offset = vec2(st.z, 0.0);
return texture(iChannel0, fract(st.xy + offset)).r * 2.0 - 1.0;
}
void main() {
int instance = index / 40;
float instanceHash = random(float(instance));
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) * 0.2;
vec2 worldPos = random2(vec2(instance)) * 3.0;
mat3 rotateY = rotationYMatrix(instanceHash * 3.14);
float windStrength = noise(vec3(worldPos * 0.05, 0.0) + iTime * 0.1) * h * 4.0;
mat3 windRot = rotationXMatrix(windStrength);
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 pos = curve;
pos.x += sideX * mix(0.05, 0.0, h * h);
pos = windRot * rotateY * pos;
pos += vec3(worldPos.x, 0.0, worldPos.y);
vH = h;
vX = sideX;
gl_Position = projectionMatrix * viewMatrix * vec4(pos, 1.0);
}
复盘笔记
- 这题牛头不对马嘴,之后回来检查什么意思