acecase 发表于 2022-5-20 14:06

Unity中的坐标变换

unity shader内建函数的命名太自由了,一段时间没用就晕得很,于是整理了这份图解笔记供查阅;
目前只整理了最重要的MVP变换及到切线空间的变换;
目前只覆盖build-in管线和URP,HDRP以后用到再说;
Build-in

UnityCG.cginc中能找到7个变换函数,被包含的UnityShaderUtilities.cginc实现了1个最重要的变换也即MVP变换,函数名为UnityObjectToClipPos;cg库文件位于安装路径/Editor/Data/CGIncludes下;
仅凭函数能进行的变换十分有限:



内置管线提供的坐标变换函数

内置管线提供的变换函数十分有限,比较特殊的变换都需要以矩阵风格书写;甚至可以认为内置管线鼓励矩阵风格的书写?甚至没有提供UnityObjectToWorld内置函数、只提供了unity_ObjectToWorld矩阵内置变量,甚至不包含到切线空间(TS)的变换,用于法线变换的函数也仅有OS到WS的一个;
用内置矩阵变量能实现自有得多的变换:


这些内置矩阵变量都是4*4的列主序矩阵,对于顶点坐标变换,乘在向量左侧即可施加相应的变换;
对于方向向量的变换只需要截取3*3的部分即可;
对于法线的变换,需要取相应变换矩阵的逆转置;若变换矩阵为正交矩阵,则逆转置即原矩阵;
但内置矩阵变量还是没能联系上切线空间,需要我们自己构造TBN矩阵;
URP

只要包含Core.hlsl即可调用相关函数,函数实现会依照Core > Input > SpaceTransforms的次序被包含进来:
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"函数实现写在SpaceTransforms.hlsl文件中,路径:
Packages/com.unity.render-pipelines.core/ShaderLibrary/SpaceTransforms.hlsl进到大纲视图可以看到其中包含的函数比内建管线多一些,但也只有25个:


CreateTangentToWorld是用于构造TBN矩阵的函数;
Get为前缀的8个函数用于获取变换矩阵或位置信息,处理了一些兼容性问题;
Transform为前缀的16个就是执行变换的函数,这命名比起build-in真是清晰得让人想哭,除了TransformWViewToHClip不知道为什么多了个W,别的都很符合直觉;
输入输出变量类型方面也进行了统一和简化;只有齐次裁剪空间坐标(posHCS)保留了w分量,其他位置与方向向量均为3维向量,因为其实只有posHCS的w分量大小是有意义的、在齐次除法中要用到,其它场合的w分量只是以0和1区分向量和位置的作用,现在这一步封装在了变换函数内部:



80行注释:调用此函数比计算M*VP的矩阵运算更高效;所以几乎没有理由采用矩阵风格而非函数风格编写shader.

5个主要坐标空间之间的变换函数如下:



切线空间(TS)、物体空间(OS)、世界空间(WS)、相机空间(VS)、齐次裁剪空间(HCS)间的坐标转换函数;
页: [1]
查看完整版本: Unity中的坐标变换