第 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 中午==