Unity Shader中内置的坐标空间与转换矩阵函数

模型空间(model space)也称为对象空间(object space)或局部空间(local space)是指以模型原点为原点的坐标系。

世界空间(world space)也称全局空间(global space)是以世界原点为原点的坐标系,世界坐标也就是Unity3D里的绝对坐标。

观察空间(view space)也称摄像机空间(camera space)是以摄像机为原点的坐标系。(这是各坐标空间中唯一一个右手坐标系)

裁剪空间(clip space)也称齐次裁剪空间(homogeneous clip space),这个空间对观察空间里的渲染图元进行裁剪,会保留完全在空间内部的图元,剔除完全在空间外部的图元,以及裁剪部分在空间内部的图元,而这块空间的范围是由摄像机的视锥体决定的。而使用投影矩阵将顶点转换到裁剪空间中去,来判断图元是否在裁剪空间内。

屏幕空间(screen space)表示的是一个二维空间,是从裁剪空间投影过来的。

从模型空间到世界空间称为模型变换,从世界空间到观察空间称为观察变换,从观察空间到裁剪空间称为投影变换,从裁剪空间到屏幕空间称为投影映射。


相关数学知识土圭垚㙓数学课(四)空间变换


Unity内置变换矩阵:

UNITY_MATRIX_MVP模型(M)观察(V)投影(P)矩阵,从模型空间到裁剪空间
UNITY_MATRIX_MV模型(M)观察(V)矩阵,从模型空间到观察空间
UNITY_MATRIX_V
观察(V)矩阵,从世界空间到观察空间
UNITY_MATRIX_P
投影(P)矩阵,从观察空间到裁剪空间
UNITY_MATRIX_VP
观察(V)投影(P)矩阵,从世界空间到裁剪空间
UNITY_MATRIX_T_MV
UNITY_MATRIX_MV的转置矩阵
UNITY_MATRIX_IT_MV
UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间转换到观察空间
_Object2World模型矩阵,从模型空间到世界空间
_World2Object_Object2World的逆矩阵,从世界空间到模型空间


Untiy摄像机和屏幕参数:

_WorldSpaceCameraPos(float3)摄像机的世界坐标
_ProjectionParams(float4)投影参数
x=±1.0(-1.0表示使用翻转投影矩阵进行渲染)
y=Near近裁剪平面与摄像机的距离
z=Far远裁剪平面与摄像机的距离
w=1.0+1.0/Far
_ScreenParams(float4)屏幕参数
x=width渲染目标的像素宽度
y=height渲染目标的像素高度
z=1.0+1.0/width
w=1.0+1.0/height
_ZBufferParams(float4)线性化Z(深度)缓冲参数
x=1-Far/Near
y=Far/Near
z=x/Far
w=y/Far
unity_OrthoParams(float4)正交投影摄像机参数
x=width
y=height
z未使用
w=1.0(正交投影摄像机)或0.0(透视摄像机)
unity_CameraProjection(float4x4)摄像机投影矩阵
unity_CameraInvProjection(float4x4)unity_CameraProjection的逆矩阵
unity_CameraWorldClipPlanes(float4[6])摄像机6个裁剪平面在世界空间下的方程式。
顺序:左、右、下、上、近、远

UnityShader是用来控制渲染图形的程序代码。在编写Shader时,经常需要生成坐标矩阵以进行各种变换,如模型空间到裁剪空间的变换。这些矩阵Shader是预定义的,可以直接使用。 1. **模型矩阵(Model Matrix)**:这个矩阵用于将模型的顶点从模型空间转换到世界空间。它考虑了模型的位置、旋转和缩放。在Shader,它通常通过`unity_ObjectToWorld`变量获得。 2. **视图矩阵(View Matrix)**:这个矩阵用于将顶点从世界空间变换到观察空间(也称为相机空间)。它表示从世界空间移除相机位置的影响。在Shader,它通常通过`UNITY_MATRIX_I_V`变量获得。 3. **投影矩阵(Projection Matrix)**:这个矩阵用于将顶点从观察空间变换到裁剪空间。裁剪空间Unity进行视锥体剔除和其他图形优化的地方。在Shader,它通常通过`UNITY_MATRIX_P`变量获得。 4. **变换矩阵(Transform Matrix)**:这是模型矩阵、视图矩阵和投影矩阵的组合。在顶点着色器,变换顶点时通常会先将顶点乘以模型矩阵,然后乘以视图矩阵,最后乘以投影矩阵,以获得裁剪空间的顶点坐标。 在Shader,这些矩阵通常已经包含了必要的变换信息,所以你不需要手动创建它们,只需要在代码正确地引用它们即可。例如,在一个顶点着色器,你可能会看到类似这样的代码: ```hlsl // 顶点着色器输入 struct appdata { float4 vertex : POSITION; }; // 顶点着色器输出 struct v2f { float4 vertex : SV_POSITION; }; // 顶点着色器函数 v2f vert(appdata v) { v2f o; // 应用变换矩阵来变换顶点 o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); return o; } // 片段着色器(省略) ``` 在这个例子,`UNITY_MATRIX_MVP`是一个预定义的矩阵,它是一个模型视图投影矩阵,用于将顶点从模型空间变换到裁剪空间。`MVP`是模型(Model)、视图(View)、投影(Projection)三个单词的缩写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值