二、Unity Shader顶点变换总结

来源:互联网 发布:程序员的自我修养 git 编辑:程序博客网 时间:2024/05/16 14:43

《Unity Shader入门精要》读书笔记 之 二

做这个总结的目的是为了加深了解一个模型上的顶点是如何从模型上一步步变换到屏幕上的,搞明白Unity到底做了些啥?

1、顶点变换的目的:
将顶点坐标坐标开始,到屏幕坐标为止的一系列转换。



2、UNITY_MATRIX_MVP矩阵的解释:
Unity内置的MVP矩阵,可以将模型上的顶点从他的本地坐标系,转换到裁剪空间中。
一个顶点转换到裁剪空间后,就表示它的w具有了特殊意义:可以用来进行透视除法,透视除法(xyz分别除以w)后的x、y用来进行屏幕映射(也就是这个顶点应该出现在屏幕上的哪个位置),z用来表示这个顶点的深度(是否离观察者更近或被其他顶点挡住等)。

M(Model):从本地坐标系 转换到世界坐标系 的转换矩阵。
V(View):从世界坐标系 转换到相机坐标系 的转换矩阵。
转换矩阵总结如下(矩阵左乘列向量):



注意:Unity的相机坐标系(观察者空间、相机空间)是比较特殊的坐标系,它使用右手坐标系,而它的前一步转换是在左手坐标系内完成的,因此顶点转换到相机坐标系后要对z进行一下处理(或使用相反的转换顺序)。

P(Projection):投影矩阵,说是投影矩阵,其实并未进行投影计算,但是它却坚强的算出了齐次向量w的值,为后面的透视除法做准备,根据相机类型的不同,投影矩阵也会有些许差别。
正交相机(orthographic)中:w的值恒为1,所以做了透视除法也没变化;
透视相机(perspective)中:w的值有意义,经过此投影矩阵计算的xyz向量需分别除以w进行透视除法即xyz / w

正交相机的矩阵总结如下(矩阵左乘列向量):


透视相机的矩阵如下(矩阵左乘列向量):


3、MVP后的顶点表示啥?

注意:
① -1.0 ~ 1.0用的时候要处理成 0.0 ~ 1.0。
② 透视投影处理后的顶点xyz要进行透视除法。

4、深度贴图采样总结:

Upgrading to Unity 5.5说明:


采样方法:
step 1、声明深度贴图(名字是系统默认的):
sampler2D_float_CameraDepthTexture;

step 2、采样深度贴图:
float depth = SAMPLE_DEPTH_TEXTURE(_CameraDepthTexture, i.uv);

step 3、处理采样数值(保证不同平台的深度值相同):
depth = Linear01Depth(depth);



0 0
原创粉丝点击