跳到主要内容
← Lighting Basics

Lighting Basics

Halfway Vector

shader-learning 自学第 7 课:Halfway Vector

实时渲染 · 网格 GLSL

第 7 课:Halfway Vector

实现

uniform float iTime;
uniform sampler2D iChannel0;

varying vec3 vPos;
varying vec3 vNormal;
varying vec2 vUv;

void main() {
  vec3 viewPos = vec3(0.0, 2.0, 2.0);

  vec3 objectColor = vec3(0.5);
  vec3 fragNormal = normalize(vNormal);
  vec3 fragPos = vPos;

  vec3 lightColor = vec3(1.0, 0.75, 0.75);
  vec3 lightPos = vec3(0.0, sin(iTime) * 2.0 + 2.0, 2.0);
  vec3 lightDir = normalize(lightPos - fragPos);


  float ambient = 0.2;
  float diffuse = max(dot(fragNormal, lightDir), 0.0);

  vec3 viewDir = normalize(viewPos - fragPos);
  vec3 HalfwayDir = normalize(lightDir + viewDir);
  float specular = max(dot(fragNormal, HalfwayDir), 0.0);

  vec3 result = lightColor * (ambient + diffuse + specular) * objectColor;

  gl_FragColor = vec4(result, 1.0);
}