法线矩阵

文章目录

原文链接

参见http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/
知乎这篇文章也不错。

正文

gl_NormalMatrix出现在很多顶点着色器中。这篇文章会解释什么是法线矩阵以及它是用来干什么的。本文灵感来源于《Mathematics for 3D Game Programming and Computer Graphics》 by Eric Lengyel。

许多计算是在观察空间里进行的。这与照明通常在这个空间中执行有关,否则与观察(眼睛)位置相关的效果(例如镜面反射光)将更难实现。

因此,我们需要一种方法将法线转换到观察空间。要将顶点转换到观察空间,我们可以编写:
在这里插入图片描述
为什么我们不能对法向量做同样的处理呢?法线是由3个浮点组成的向量,modelview矩阵是4×4的。其次,由于法线是一个向量,我们只想变换它的方向。包含方向的modelview矩阵区域是左上角的3×3子矩阵。为什么不把法线乘以这个子矩阵呢?

这可以通过以下代码轻松实现:
在这里插入图片描述
那么,gl_NormalMatrix只是简化代码编写或优化代码的捷径吗?不,不是真的。上面的代码行在某些情况下有效,但不是所有情况下都有效。

在这里插入图片描述

在上图中,我们看到一个三角形,有一个法向量和一个切向量。下图显示了modelview矩阵包含不等比缩放时发生的情况。
在这里插入图片描述
注意:如果缩放是一致的,那么法线的方向会被保留,长度会受到影响,但是这可以通过标准化很容易地修复。

在上图中,Modelview矩阵应用于所有顶点以及法线,结果显然是错误的:变换后的法线不再垂直于曲面。

我们知道向量可以表示为两点之间的差。考虑到切向量,它可以计算为三角形边的两个顶点之间的差。如果 P 1 P_1 P1 P 2 P_2 P2

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值