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矩阵的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中的渲染引擎也不会将整个场景进行渲染,而只是渲染出现在镜头中的物体。如何判定物体是否处于镜头中呢?这就是视锥体的概念,它长得和金字塔一样。
只有处于视锥体内的物体才会被渲染,而其他部分都将处于视线之外,从而得到我们在屏幕上能看到的东西。视锥体是由远近剪切屏幕以及视角大小所定义的一个平头锥体,而相机就处于这个锥体的顶尖上。这个过程的专业术语叫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所必需完成的工作。
说到“空间”这个概念,这里所有用到和讲述的空间都是初中和高中时代的三维欧儿里德空间,也就是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中的渲染引擎也不会将整个场景进行渲染,而只是渲染出现在镜头中的物体。如何判定物体是否处于镜头中呢?这就是视锥体的概念,它长得和金字塔一样。
只有处于视锥体内的物体才会被渲染,而其他部分都将处于视线之外,从而得到我们在屏幕上能看到的东西。视锥体是由远近剪切屏幕以及视角大小所定义的一个平头锥体,而相机就处于这个锥体的顶尖上。这个过程的专业术语叫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所必需完成的工作。
相关文章推荐
- C 注意事项
- cookie、session、sessionid 与jsessionid(转)
- 使用layout_weight设置控件占屏幕百分比
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- Android Studio 连接不上真机
- JS模仿手机端九宫格登录功能实现代码
- JS日期相差天数
- PorterDuffXfermode使用及工作原理详解
- Mac Intellij IDEA 15 JRebel642.0 破解 (2016-03-27 12:17:09)
- HDU 2004 成绩转换(水题。。。)
- Weka c4.5 决策树 j48源码 解析(一)
- 上机题-字符个数统计
- MySQL中REGEXP正则表达式使用大全
- jQuery实现的鼠标经过时变宽的效果(附demo源码)
- iOS 控件宽高字体大小适配方法
- [javase]通过异常处理错误
- 火狐浏览器造成 spring3 MVC action的方法会执行两次
- 计算机网络复习
- html,shtml和htm的区别
- Intellij IDEA 创建Web项目并在Tomcat中部署运行