跳到主要内容
← Lighting Basics

Lighting Basics

Roughness - Normal distribution function

**Trowbridge-Reitz GGX**是用来替代Blinn-Phong中间specular的公式, 也就是大名鼎鼎的D

实时渲染 · 网格 GLSL

第 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 控制 高光形状