找回密码
 立即注册
查看: 227|回复: 0

Unity中的坐标变换

[复制链接]
发表于 2022-5-20 14:06 | 显示全部楼层 |阅读模式
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)间的坐标转换函数;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 08:20 , Processed in 0.192188 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表