Unity Shader入门精要笔记 UNITY_MATRIX_MVP 和 _worldspacecamerapos

本文深入探讨Unity Shader中的法线变换,解释为何不能直接使用顶点变换矩阵,并介绍了法线变换矩阵的求解过程。此外,文章还讲解了Unity Shader的内置变量,如UNITY_MATRIX_MVP和_worldspacecamerapos,以及Cg中矢量和矩阵的类型和运算规则。最后提到了屏幕坐标获取的方法ComputeScreenPos和VPOS/WPOS的使用。
摘要由CSDN通过智能技术生成

https://blog.csdn.net/lzhq1982/article/details/73747162



本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢。

http://blog.csdn.net/lzhq1982/article/details/73747162


前两篇介绍了Unity Shader的主要数学部分,书上还有些相关的数学介绍,将在这篇做最后的总结。

1、法线变换

法线(normal),也被称为法矢量。游戏中,模型的顶点携带的信息中,法线就是其中一种。我们变换一个模型,不仅需要变换它的顶点,还需要变换顶点法线,以便在后续处理中计算光照等。

从上一篇我们知道,点和大部分方向矢量都可以用同一个变换矩阵在两个空间之间变换。但法线用同一个变换矩阵,可能无法确保维持法线的垂直性。下面介绍一下原因。

先来了解一下另一种方向矢量:切线(tangent),也叫切矢量。也是顶点携带的一种信息。它与法线方向垂直。切线是两个点之间的差值计算得来的,因此可以直接用变换顶点的变换矩阵来变换切线。假设,这个变换顶点也就是变换切线的矩阵是3x3的变换矩阵 (因为是方向矢量,不受平移影响,不用4x4),得到空间变换公式如下:


T表示切线,上面表示切线从空间A到空间B的转换。但如果直接用同一矩阵变换法线,得到的新法线可能就不会与表面垂直了,例如:


那么怎么求法线变换的矩阵呢。答案是用法线和切线垂直的约束公式:。假设我们用矩阵G来变换法线,则有。然后结合,我们得到下面公式:


然后推导可得:


有很多人对第一个等式有疑问,请大家注意第一个等式左边是向量点乘,有个点,等式右边把向量变成了列矩阵,变成了矩阵相乘,中间没点了。其他应该没问题。看最后的等式部分,因为,把T变成列矩阵,所以,所以如果,那么上面的等式就成立了。那我们的结论就是:


如果是正交矩阵,那其逆就是其转置,那么G = ,也就是说我们可以用变换顶点的矩阵变换法线。从上一篇的表格中可以看出,旋转变换是正交矩阵,可以直接用,如果只包含旋转和统一缩放,不包含非统一缩放,则


其他情况,我们就要求的逆转置了。

2、Unity Shader 内置变量(数学)

Unity给我们提供了很多有关变换的内置参数,这些内置变量可以在UnityShaderVariables.cginc文件中找到定义和说明。

1)变换矩阵


注意最后两个,Unity5.5版本中_Object2World已经变成unity_ObjectToWorld,_World2Object也变成了unity_WorldToObject,但由于Unity的向下兼容性,Unity会自动改写它们,不会出错。还有在顶点着色器中,我们往往第一行就会用到UNITY_MATRIX_MVP:mul(UNITY_MATRIX_MVP, v.vertex); 这是把顶点从模型空间转换到裁剪空间,不用我们手动变换空间了,不过这在unity5.6中已经改为:UnityObjectToClipPos(v.vertex); 在UnityShaderUtilities.cginc里,注意5.6以上版本才有这个文件。官方实现如下:

[cpp]  view plain   copy
  1. // Tranforms position from object to homogenous space  
  2. inline float4 UnityObjectToClipPos(in float3 pos)  
  3. {  
  4.     // More efficient than computing M*VP matrix product  
  5.     return mul(UNITY_MATRIX_VP, mul(unity_ObjectToWorld, float4(pos, 1.0)));  
  6. }  
可以看出也是先转到世界空间,再乘以观察和投影矩阵,只不过注释那里很清楚,更高效一些。

2)摄像机和屏幕参数



读者也没有必要记住他们,以后用到了方便查阅就行。用多了就记住了。

3、Cg中矢量和矩阵类型

我在Unit

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值