您的位置:首页 > 其它

untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念

2016-04-28 11:32 225 查看
第三章Shader(着色器)中用到的各种空间概念

说到“空间”这个概念,这里所有用到和讲述的空间都是初中和高中时代的三维欧儿里德空间,也就是3个坐标轴x, y,z的形式,在计算机图形学中为了矩阵计算的方便,外加一个W,也就是齐次坐标表示方法这个W经常被用作除数

3.1模型空间

3.1.1为什么用模型空间

在诸如3ds Max和Maya这样的建模软件中,为了表示的方便性和实用性,每一个物体都有一个以它自己的Pivot为原点的欧几里德三维坐标空间。箭头所示为其模型空间(Model Space)的x. y轴。

3.1.2在脚本和Shader中进出模型空间

在Unity的脚本中,可以通过transform.worldToLocalMatrix这个矩阵的MultiplyPoint()或者MultiplyVector()方法,把世界坐标表达的矢量转换为为此物体的模型空间表达的矢量。在Shader中,可以通过左乘_World20bject这个矩阵来完成此项任务。
3.2世界坐标空间

3.2.1统一表达:世界坐标空间

模型空间在处理物体自身的一些相对关系时比较有用,比如其自身的面、线、点等,但是在更高一个层级上,比如我们有许多个物体,这时为了能够表达这些模型的相对关系、位置、大小、旋转等,就需要一个统一空间坐标,这就是世界坐标空间。就好比不论你身在北京时区、东京时区、还是巴黎时区、纽约时区,通过使用格林尼治时间都可以消除彼此的差异。
3.2.2在脚本和Shader中进出世界坐标空间

假设一个物体上有一个顶点,出于方便,这个点是被以此物体自身的模型空间坐标来表达的,如果我们想让它和另一个物体上的一个点做比较,比如相对位置,该怎么办呢?很显然,世界坐标可以把这两个点表达为统一的形式。在脚本中,物体的Transfrom组件的localToWorldMatrix矩阵的MulitplyPointMultiply Vector方法能把此物体自身以模型空间坐标表达的矢量变换到以世界坐标表达的矢量。在Shader中,对应的矩阵是_Object2
World

3.3视空间

3.3.1渲染的需要:视空间

视空间,又称相机空间,是为了方便表达以相机为世界的中心时所有物体的相互关系的一个空间。
3.3.2在脚本和Shader中进出视空间

我们可以通过相机Camera组件的worldToCameraMatrix来把一个世界坐标的向量重新表示为一个以相机为中心的空间的表达形式。如果我们想把一个相机空间的向量重新表示到世界坐标,可以用cameraToWorldMatrix来实现。在Shader中,有一个矩阵UNITY_MATRIX_MV可以把向量一次性从模型空间转换到视空间内。

3.4空间的一块:视锥体

看得到的部分:视锥体

虽然整个世界的存在是不可罩疑的,但是我们无法直视好莱坞影片的帅哥佳丽和俊男美女,因为太远了,我们也看不到背后的东西,因为我们的眼睛没有长在脑袋的后面。同样的道理,Unity中的渲染引擎也不会将整个场景进行渲染,而只是渲染出现在镜头中的物体。如何判定物体是否处于镜头中呢?这就是视锥体的概念,它长得和金字塔一样



只有处于视锥体内的物体才会被渲染,而其他部分都将处于视线之外,从而得到我们在屏幕上能看到的东西。视锥体是由远近剪切屏幕以及视角大小所定义的一个平头锥体,而相机就处于这个锥体的顶尖上。这个过程的专业术语叫Culling
3.5剪切空间

3.5.1投影

之后我们需要准备把三维的物体表示到一个二维的平面上,这个过程首先需要投影一次,把视锥体变换为一个长方体,如图3.5所示,这次变换是vertex Shader任务的终点。之后的引擎会自动处理下面的事情,把坐标转换到NDC (Normalized Device Coordinates)。这是一个无量纲的空间,OpenGL和Direct3D稍有不同,OpenGL的值域是(-1,-1,-1)到(1,
1, 1 ); Direct3D

的值域是(-1,0,-1)到(1, 1,1)。
3.5.2脚本和Shader中的投影矩阵

在脚本中代表这个投影操作的是Camera组件的projectionMatrix,在Shader中则是UNITY_MATRIX_MVP矩阵。我们完全可以把上面这一系列步骤一次完成,也就是把上面提到的几个矩阵组合到一起,从而得到UNITY_MATRIX_MVP这个矩阵。通过这个矩阵,可以直接把物体上的一个点投射到屏幕上,这也是正常显示一个物体的Shader所必需完成的工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: