You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

顶点着色器中变换矩阵使用验证:法线变换正确性确认

关于法线变换方案的合理性判断

嘿,我来帮你梳理下逐顶点光照里法线变换的关键逻辑~

首先得明确一个核心点:顶点坐标和法线的变换规则是完全不同的,这也是很多人容易踩坑的地方。

顶点变换 vs 法线变换的本质区别

顶点是位置点,直接用 模型视图投影矩阵 相乘就能完成从局部空间到裁剪空间的变换,这个逻辑没问题。但法线是方向向量,它的作用是表示表面的朝向,一旦模型矩阵包含非均匀缩放(比如x轴缩放2倍、y轴缩放1倍),直接用顶点变换的矩阵去乘法线,会导致法线不再垂直于表面,最终的光照计算(比如漫反射、高光)会完全失真。

正确的法线变换方案

标准的做法是使用 模型矩阵(或模型视图矩阵)的逆矩阵的转置 来变换法线:

// 假设modelView是你的模型视图矩阵,normal是原始法线
vec3 transformedNormal = transpose(inverse(mat3(modelView))) * normal;

这里取mat3(modelView)是因为法线是3维方向向量,不需要考虑平移分量,所以只用到矩阵的左上角3x3部分。

如果你的模型矩阵是正交矩阵(只有旋转、平移操作,没有缩放或者只有均匀缩放),那逆矩阵等于转置矩阵,这时候直接用模型矩阵的3x3部分变换法线也能得到正确结果,但为了兼容性(万一后续加了非均匀缩放),还是推荐用逆转置的写法。

对你方案的判断

你提到在第8-9行完成了全部变换,虽然没看到具体代码,但可以用这两个标准自查:

  • 如果你的代码里用了模型矩阵的逆转置来处理法线,那这个方案是完全合理的,符合逐顶点光照的标准实现;
  • 如果只是把顶点变换的矩阵直接套用给了法线,那这个方案存在隐患,尤其是当模型有非均匀缩放时,光照效果会出现错误。

内容的提问来源于stack exchange,提问作者zlon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:13:11