第 13 课:Roughness - Normal distribution function
实现:Trowbridge-Reitz GGX是用来替代Blinn-Phong中间specular的公式, 也就是大名鼎鼎的D
实现
uniform float iTime;
varying vec3 vPos;
varying vec3 vNormal;
varying vec2 vUv;
float DistributionGGX(vec3 N, vec3 H, float a){
float a2 = a*a;
float NdotH = max(dot(N, H), 0.0);
float NdotH2 = NdotH*NdotH;
float nom = a2;
float denom = (NdotH2 * (a2 - 1.0) + 1.0);
denom = 3.14 * denom * denom;
return nom/denom;
}
void main() {
vec3 viewPos = vec3(0.0, 0.0, 2.5);
vec3 fragDiffuse = vec3(1.0, 0.6, 0.6);
vec3 fragNormal = normalize(vNormal);
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 ambient = 0.2;
float t = (sin(iTime * 0.5) * 0.5 + 0.5);
float powr = pow(t,2.0);
float PI = 3.14;
float NDF = DistributionGGX(fragNormal, halfwayDir, t);
vec3 result = NDF * fragDiffuse * lightColor;
gl_FragColor = vec4(result, 1.0);
}
复盘笔记
- Trowbridge-Reitz GGX是用来替代Blinn-Phong中间specular的公式, 也就是大名鼎鼎的D
- ![[Pasted image 20251204212944.png]]![[Pasted image 20251204231804.png]]![[Pasted image 20251204231829.png]]
- 问题:有多少微小镜子的角度,刚好能把光反射到摄像机里?
- 表现:
- 光滑表面:微小镜子都很整齐,大部分都能把光反射给你 -> 高光很小、很亮、很锐利。
- 粗糙表面:微小镜子乱七八糟,只有少部分刚好对准你 -> 高光很大、很暗、很模糊。
- D_GGX 控制 高光形状