第 14 课:Roughness - Geometry function
实现:G_SmithGGX 控制 光能被遮挡/被阻挡多少
实现
uniform float iTime;
varying vec3 vPos;
varying vec3 vNormal;
varying vec2 vUv;
float geometryGGX(float NdotX, float k){
float nom = NdotX;
float denom = NdotX * (1.0 - k ) +k;
return nom / denom;
}
float geometrySmith(vec3 N, vec3 V, vec3 L, float k){
float NdotV = max(dot(N,V),0.0);
float NdotL = max(dot(N,L),0.0);
float ggx1 = geometryGGX(NdotV, k);
float ggx2 = geometryGGX(NdotL, k);
return ggx1*ggx2;
}
void main() {
vec3 viewPos = vec3(0.0, 0.0, 2.5);
vec3 fragColor = vec3(1.0, 0.6, 0.6);
vec3 fragNormal = normalize(vNormal);
float fragRoughness = 0.01 + (sin(iTime * 0.5) * 0.5 + 0.5) * 0.99;
vec3 fragPos = vPos;
vec3 lightColor = vec3(1.0, 1.0, 0.75);
vec3 lightPos = vec3(-2.0, 2.0, 2.0);
vec3 lightDir = normalize(lightPos - fragPos);
vec3 viewDir = normalize(viewPos - fragPos);
vec3 halfwayDir = normalize(viewDir + lightDir);
float shininess = 2.0;
float specular = pow(max(dot(fragNormal, halfwayDir), 0.0), shininess);
float roughnessTransformationFunc = pow(fragRoughness+1.0,2.0)/8.0;
float GLV_SmithGGX = geometrySmith(fragNormal, viewDir, lightDir, roughnessTransformationFunc);
vec3 result = GLV_SmithGGX * specular * fragColor * lightColor;
gl_FragColor = vec4(result, 1.0);
}
复盘笔记
- G_SmithGGX 控制 光能被遮挡/被阻挡多少
- geometryGGX: ![[Pasted image 20251205000714.png]]
- geometrySmith:
- ![[Pasted image 20251205000743.png]]
- ![[Pasted image 20251205000830.png]]