Unity3d中Shader的一些关于矩阵变换的基本信息

基本信息

mul函数

mul函数,是表示矩阵M和向量V进行点乘,得到一个向量Z,这个向量Z就是对向量V进行矩阵变换后得到的值。
HLSL的mul函数接受mul(V, M)或mul(M, V),要注意通常HLSL要依DirectX计算(V * M)使用mul(V, M)的形式.
特别需要小心的是,V如果是float3,前后行列不等,违反HLSL规范,但shader编译也不报错,直接当成float4(V, 0)处理,而不是当成float4(V, 1).即mul(float3, M)中的float3被当成向量,而不是顶点.
Unity3d 中,若是OpenGL,用的应该是GLSL,mul方法是(M,V)。

矩阵

内置的矩阵(float4x4):

名称说明
UNITY_MATRIX_MVP当前模型视图投影矩阵
UNITY_MATRIX_MV当前模型视图矩阵
UNITY_MATRIX_V当前视图矩阵
UNITY_MATRIX_P当前的投影矩阵
UNITY_MATRIX_VP当前视图投影矩阵
UNITY_MATRIX_T_MV模型视图矩阵的转置
UNITY_MATRIX_IT_MV模型视图矩阵的逆转置
_Object2World当前模型矩阵
_World2Object当前世界矩阵的逆矩阵

这里要特别说明一下UnityObjectToClipPos(v.vertex)) 方法,官方网站上说明,在写Instanced Shader时,通常情况下并不用在意顶点空间转换,因为所有内建的矩阵名字在Instanced Shader中都是被重定义过的,如果直接使用UNITY_MATRIX_MVP,会引入一个额外的矩阵乘法运算,所以推荐使用UnityObjectToClipPos / UnityObjectToViewPos函数,它们会把这一次额外的矩阵乘法优化为向量-矩阵乘法。

相机

名称类型数值
_WorldSpaceCameraPosfloat3世界空间相机的位置
_ProjectionParamsfloat4x = 1.0(或如果当前使用翻转投影矩阵渲染则为-1.0),y是相机的近平面,z是相机的远平面,w是1 / FarPlane
_ScreenParamsfloat4x是相机的渲染目标在像素里的宽度,y是相机的渲染目标在像素里的高度,z是1.0 + 1.0 /宽度和w是1.0 + 1.0 /高度
_ZBufferParamsfloat4用于线性化Z缓冲区的值。x(1-far /near),y(far/near)、z(x /far)和w(y /far)
unity_OrthoParamsfloat4x是正交的相机的宽度,y是正交的相机的高度,z是未使用的,为正交的相机时w为1.0,透视相机时w为0.0
unity_CameraProjectionfloat4x4摄像机的投影矩阵
unity_CameraInvProjectionfloat4x4摄像机的投影矩阵的逆矩阵
unity_CameraWorldClipPlanes[6]float4相机锥平面世界空间方程,按顺序为:左、右、底部、顶部、近、远

光照

名称类型数值
_LightColor0(Lighting.cginc中声明)fixed4光照颜色
_worldspacelightpos0float4方向光:(世界空间方向,0)。其他光:(世界空间位置,1)
_LightMatrix0(AutoLight.cginc声明)float4x4world-to-light矩阵。用于样品cookie 和衰减纹理
unity_4LightPosX0、unity_4LightPosY0 unity_4lightposz0float4(仅ForwardBase通道)前四个不重要的点光源的世界空间坐标
unity_4lightatten0float4(仅ForwardBase通道)前四个不重要的点光源的衰减系数
unity_lightcolorhalf4[4](仅ForwardBase通过)前四个不重要的点光源的颜色数组

在Shader的光照通道里的延迟着色和延迟光照(在unitydeferredlibrary.cginc):

名称类型数值
_LightColorfloat4光照颜色
_LightMatrix0float4x4world-to-light矩阵。用于样品cookie 和衰减纹理

多光源下,最多8个光源在顶点通道,排序为从最亮的开始

名称类型数值
unity_LightColorhalf4[8]光照颜色数组
unity_LightPositionfloat4[8]视图空间光源的位置。方向光源的坐标是(-方向,0);(位置,1)用于点/点指示灯,点光源,聚光灯的坐标是(位置,1)
unity_LightAttenhalf4[8]光源衰减的系数。X是cos(spotAngle/2)或非聚光灯为-1;Y为1/COS(spotangle / 4)或非聚光灯为-1;Z是衰减的二次方;W是正方形光源的范围
unity_SpotDirectionfloat4[8]视图空间聚光灯的位置;(0,0,1,0)则非聚光灯。

基本变换

在Unity中,每个物体都有一个坐标系,就是自身坐标系,各个物体之间相互独立。
所有的物体都处在一个统一的空间里,这个空间就是世界空间,也有一个世界坐标系。
把一个3D物体渲染到2D的屏幕上的基本流程以及每个变换对应的矩阵

  1. 因为物体的顶点坐标是基于自身坐标系的,所以渲染时,最先的变换是 模型空间——>世界空间,对应矩阵:_Object2World
  2. 物体要渲染到相机平面上实际上,是相机的可视区域内有哪些物体,也就是物体处于相机坐标系的本地坐标(localPosition)处于哪个位置。这个变换是 世界空间——>相机空间,对应矩阵:UNITY_MATRIX_V
  3. 此刻获取到了物体处于相机空间的位置,要把相机空间的所有信息都渲染到2维图片上,此刻需要进行投影变换,透视相机投影变换的目的是为了把视锥体转换为立方体,转换后,视锥体近平面的右上角点变成立方体前平面的中心,把视锥体较小的部分放大,较大的部分缩小,形成最终的立方体。变换后的x坐标范围是[-1, 1],y坐标范围是[-1, 1],z坐标范围是[0, 1](OpenGL不同,z值范围是[-1, 1]),这个变换是 相机空间——>投影空间,对应矩阵:UNITY_MATRIX_P

    通过UNITY_MATRIX_MVP 这个矩阵,可以把物体的顶点位置从模型自身坐标系转换到投影空间。
    对投影矩阵感兴趣的,可以自己搜索一下,整个推导过程需要一定的数学基础,理解就行。

    切线空间矩阵

    法线贴图大部分都是蓝色的,是因为法线贴图里存储的值都是Tangent Space(切空间)下的。
    在切线空间中,垂直于表面的法线向量是(0,0,1)。该向量转成像素是(0,0,127),这个值是蓝色的,由于大部分的数值都跟这个相差不会很大,也就是说,像素之间的差别并不是非常的明显,所以大部分都是偏蓝色。
    切空间(TBN)是表示物体模型上的顶点坐标位置随着纹理坐标(u,v)的变化而变化,该顶点切线空间的X轴方向是连接该点与下一个点坐标u的方向,该顶点切线空间Y轴方向是连接改点与下一个坐标v的方向,Z轴则是改点的法线方向。简单一点来说,也可以这么理解,该顶点的X轴就是该顶点的uv坐标系下的u轴,Y轴就是该顶点的uv坐标系下的v轴。
    其中

    T=(dxdu,dydu,dzdu)B=N×TN=T×(dxdv,dydv,dzdv)

    TBN切线空间矩阵M是[T,B,N]
    [T,B,N]=TxTyTzBxByBzNxNyNz

    如果三向量互相垂直,实际上也基本如此,Unity中,没有考虑其它情况。
    它的逆矩阵就等于它的转置矩阵。
    [T,B,N]1=TxBxNxTyByNyTzBzNz

    切线空间矩阵[T,B,N]的作用是为了把空间向量转换为切线空间里的向量。在做光照计算时,光源实在世界空间中,由于需要得到光线向量和法向量的夹角,而法线向量是在切线空间中,所以都是把一个转换到另外一个空间中,进行计算。
    有的是把光线向量转换到切线空间中进行计算,所以用到的基本上都是矩阵[T,B,N]的逆矩阵
    [T,B,N]1

    用它来乘以光照方向,得到光照在切线空间的转换。
    有的是把法线转换到世界空间进行计算,直接用矩阵来进行计算。

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity3D导入ASE(Amplify Shader Editor)时,需要注意你的项目环境。如果是标准的Unity3D项目,可以直接使用ASE里的Legacy着色器进行编辑和使用。如果是URP(Universal Render Pipeline)或HDRP(High Definition Render Pipeline)项目环境,建议使用ASE里的Universal着色器。不同插件渲染方式的差异会导致一些问题,所以在使用ASE时要确保使用匹配的环境才能正常显示,否则会呈现一片紫色。你可以在Unity的官方商店下载这个shader(需要支持正版),导入后会有一个启动首页,建议先查看一下,因为后面可能会遇到一些需要注意的地方。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Unity学习笔记-ASE shadergragh的一些使用心得](https://blog.csdn.net/pure81/article/details/119175731)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [Unity3d (ASE)Amplify Shader Editor 1.8.9.035](https://download.csdn.net/download/we626266613/85722893)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值