跳到主要内容
← Lighting Basics

Lighting Basics

Roughness - Geometry function

**G_SmithGGX** 控制 **光能被遮挡/被阻挡多少**

实时渲染 · 网格 GLSL

第 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]]