跳到主要内容
← Built-In functions

Built-In functions

CrossProduct

这个是标准答案了

实时渲染 · 网格 GLSL

第 43 课:CrossProduct

我的解:这个是标准答案了

我的解

varying vec3 vPos;

const vec3 lightPos = vec3(0.0, 1.0, 3.0);

void main() {
  // Step 1: 计算世界空间下的法线
  vec3 dx = dFdx(vPos);
  vec3 dy = dFdy(vPos);

  vec3 normal = normalize(cross(dx, dy));

  // Step 2: 计算光照方向
  vec3 lightDir = normalize(lightPos - vPos);

  // Step 3: 计算Lambertian漫反射 Normal*lightDir
  float diff = max(dot(normal, lightDir), 0.0);

  // Step 4: 用灰度表示光照强度
  gl_FragColor = vec4(vec3(0.0, 0.55, 0.55)*diff, 1.0);
}

复盘笔记

  • 这个是标准答案了
  • dFdy(...) 表示:**相邻像素在垂直方向(屏幕 y 方向)**上,这个变量的变化。
  • vPos 是每个片元在世界空间的坐标,所以 dFdx(vPos) 返回的是:该片元与右边相邻片元之间的位置差向量(∆x)
  • dFdx(...) 表示:**相邻像素在水平方向(屏幕 x 方向)**上,这个变量的值变化多少。
  • 同样表示这个面在垂直方向上的边(∆y)。
  • <2025/05/23>
  • ==记录时间: 9月16日 2025, 11:52 中午==