untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
来源:互联网 发布:网络维护常用工具 编辑:程序博客网 时间:2024/06/11 19:01
第三章Shader(着色器)中用到的各种空间概念
说到“空间”这个概念,这里所有用到和讲述的空间都是初中和高中时代的三维欧儿里德空间,也就是3个坐标轴x, y,z的形式,在计算机图形学中为了矩阵计算的方便,外加一个W,也就是齐次坐标表示方法,这个W经常被用作除数。
在Unity的脚本中,可以通过transform.worldToLocalMatrix这个矩阵的MultiplyPoint()或者MultiplyVector()方法,把世界坐标表达的矢量转换为为此物体的模型空间表达的矢量。在Shader中,可以通过左乘_World20bject这个矩阵来完成此项任务。
模型空间在处理物体自身的一些相对关系时比较有用,比如其自身的面、线、点等,但是在更高一个层级上,比如我们有许多个物体,这时为了能够表达这些模型的相对关系、位置、大小、旋转等,就需要一个统一空间坐标,这就是世界坐标空间。就好比不论你身在北京时区、东京时区、还是巴黎时区、纽约时区,通过使用格林尼治时间都可以消除彼此的差异。
视空间,又称相机空间,是为了方便表达以相机为世界的中心时所有物体的相互关系的一个空间。
之后我们需要准备把三维的物体表示到一个二维的平面上,这个过程首先需要投影一次,把视锥体变换为一个长方体,如图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个坐标轴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矩阵的MulitplyPoint和Multiply Vector方法能把此物体自身以模型空间坐标表达的矢量变换到以世界坐标表达的矢量。在Shader中,对应的矩阵是_Object2 World 。3.3视空间
3.3.1渲染的需要:视空间视空间,又称相机空间,是为了方便表达以相机为世界的中心时所有物体的相互关系的一个空间。
3.3.2在脚本和Shader中进出视空间
我们可以通过相机Camera组件的worldToCameraMatrix来把一个世界坐标的向量重新表示为一个以相机为中心的空间的表达形式。如果我们想把一个相机空间的向量重新表示到世界坐标,可以用cameraToWorldMatrix来实现。在Shader中,有一个矩阵UNITY_MATRIX_MV可以把向量一次性从模型空间转换到视空间内。
3.4空间的一块:视锥体
看得到的部分:视锥体虽然整个世界的存在是不可罩疑的,但是我们无法直视好莱坞影片的帅哥佳丽和俊男美女,因为太远了,我们也看不到背后的东西,因为我们的眼睛没有长在脑袋的后面。同样的道理,Unity中的渲染引擎也不会将整个场景进行渲染,而只是渲染出现在镜头中的物体。如何判定物体是否处于镜头中呢?这就是视锥体的概念,它长得和金字塔一样。
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所必需完成的工作。 0 0
- untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_1_Unity通过ShaderLab 来组织Shader
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_2_Unity中Shader的3种形态
- untiy 3d ShaderLab_第 2 章Unity中Shader(着色器)的形态_3_Shader的数据接口:属性和 uniform变量
- untiy 3d ShaderLab第 1 章Shader(着色器)的概念和在 3D 游戏中的作用
- untiy 3d ShaderLab_第4章_基本的光照模型
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第9章_2_球体阴影(二) 阴影的淡入/淡出
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_1_不同LightMode 被选择的顺序
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_2_3个渲染路径之外
- untiy 3d ShaderLab_第7章_ Forward渲染路径_2_Forward渲染路径下的重要光源
- untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行
- untiy 3d ShaderLab_第8章_4_ 单光照贴图在Deferred 渲染路径下的实时阴影
- untiy 3d ShaderLab_第9章_1_平面阴影(二) 点光源对平面的投影
- untiy 3d ShaderLab_第9章_1_平面阴影(三) 点光源对平面的投影
- untiy 3d ShaderLab_第9章_2_球体阴影(一) 平行光对球体的投影
- untiy 3d ShaderLab_第9章_3_球体阴影(三) 点光源对球体的投影
- 第五十五篇:删除一个数组中多个连续或不连续重复的数字,保留一个
- Mybatis中配置Mapper的方法
- 在MVC4里控制器接受前台数据向数据库添加后发现数据全是 问号???
- android获取今天周几的示例
- 算法竞赛入门经典第三章总结(2):后半部分习题解答
- untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
- 第 N 项斐波那契数列的值—Java
- #HDU 4747 Mex 【通过区间处理next变化统计总值】
- Linux命令学习之路
- sonar
- HDU 2003 求绝对值(水题)
- 自定义java注解
- HDU 5601 N*M bulbs
- 介绍bigpipe以及在django上的实现,bigpipedjango实现