Unity3d中Shader的一些关于矩阵变换的基本信息
来源:互联网 发布:淘宝哪个母婴店比较好 编辑:程序博客网 时间:2024/05/01 16:22
基本信息
mul函数
mul函数,是表示矩阵M和向量V进行点乘,得到一个向量Z,这个向量Z就是对向量V进行矩阵变换后得到的值。
HLSL的mul函数接受mul(V, M)或mul(M, V),要注意通常HLSL要依DirectX计算(V * M)使用mul(V, M)的形式.
特别需要小心的是,V如果是float3,前后行列不等,违反HLSL规范,但shader编译也不报错,直接当成float4(V, 0)处理,而不是当成float4(V, 1).即mul(float3, M)中的float3被当成向量,而不是顶点.
Unity3d 中,若是OpenGL,用的应该是GLSL,mul方法是(M,V)。
矩阵
内置的矩阵(float4x4):
这里要特别说明一下UnityObjectToClipPos(v.vertex)) 方法,官方网站上说明,在写Instanced Shader时,通常情况下并不用在意顶点空间转换,因为所有内建的矩阵名字在Instanced Shader中都是被重定义过的,如果直接使用UNITY_MATRIX_MVP,会引入一个额外的矩阵乘法运算,所以推荐使用UnityObjectToClipPos / UnityObjectToViewPos函数,它们会把这一次额外的矩阵乘法优化为向量-矩阵乘法。
相机
光照
在Shader的光照通道里的延迟着色和延迟光照(在unitydeferredlibrary.cginc):
多光源下,最多8个光源在顶点通道,排序为从最亮的开始
基本变换
在Unity中,每个物体都有一个坐标系,就是自身坐标系,各个物体之间相互独立。
所有的物体都处在一个统一的空间里,这个空间就是世界空间,也有一个世界坐标系。
把一个3D物体渲染到2D的屏幕上的基本流程以及每个变换对应的矩阵
- 因为物体的顶点坐标是基于自身坐标系的,所以渲染时,最先的变换是 模型空间——>世界空间,对应矩阵:_Object2World
- 物体要渲染到相机平面上实际上,是相机的可视区域内有哪些物体,也就是物体处于相机坐标系的本地坐标(localPosition)处于哪个位置。这个变换是 世界空间——>相机空间,对应矩阵:UNITY_MATRIX_V
此刻获取到了物体处于相机空间的位置,要把相机空间的所有信息都渲染到2维图片上,此刻需要进行投影变换,透视相机投影变换的目的是为了把视锥体转换为立方体,转换后,视锥体近平面的右上角点变成立方体前平面的中心,把视锥体较小的部分放大,较大的部分缩小,形成最终的立方体。变换后的x坐标范围是[-1, 1],y坐标范围是[-1, 1],z坐标范围是[0, 1](OpenGL不同,z值范围是[-1, 1]),这个变换是 相机空间——>投影空间,对应矩阵:UNITY_MATRIX_P
通过UNITY_MATRIX_MVP 这个矩阵,可以把物体的顶点位置从模型自身坐标系转换到投影空间。
对投影矩阵感兴趣的,可以自己搜索一下,整个推导过程需要一定的数学基础,理解就行。切线空间矩阵
法线贴图大部分都是蓝色的,是因为法线贴图里存储的值都是Tangent Space(切空间)下的。
在切线空间中,垂直于表面的法线向量是(0,0,1)。该向量转成像素是(0,0,127),这个值是蓝色的,由于大部分的数值都跟这个相差不会很大,也就是说,像素之间的差别并不是非常的明显,所以大部分都是偏蓝色。
切空间(TBN)是表示物体模型上的顶点坐标位置随着纹理坐标(u,v)的变化而变化,该顶点切线空间的X轴方向是连接该点与下一个点坐标u的方向,该顶点切线空间Y轴方向是连接改点与下一个坐标v的方向,Z轴则是改点的法线方向。简单一点来说,也可以这么理解,该顶点的X轴就是该顶点的uv坐标系下的u轴,Y轴就是该顶点的uv坐标系下的v轴。
其中⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪T=(dxdu,dydu,dzdu)B=N×TN=T×(dxdv,dydv,dzdv)
TBN切线空间矩阵M是[T,B,N][T,B,N]=⎡⎣⎢TxTyTzBxByBzNxNyNz⎤⎦⎥
如果三向量互相垂直,实际上也基本如此,Unity中,没有考虑其它情况。
它的逆矩阵就等于它的转置矩阵。[T,B,N]−1=⎡⎣⎢TxBxNxTyByNyTzBzNz⎤⎦⎥
切线空间矩阵[T,B,N]的作用是为了把空间向量转换为切线空间里的向量。在做光照计算时,光源实在世界空间中,由于需要得到光线向量和法向量的夹角,而法线向量是在切线空间中,所以都是把一个转换到另外一个空间中,进行计算。
有的是把光线向量转换到切线空间中进行计算,所以用到的基本上都是矩阵[T,B,N]的逆矩阵[T,B,N]−1
用它来乘以光照方向,得到光照在切线空间的转换。
有的是把法线转换到世界空间进行计算,直接用矩阵来进行计算。
- Unity3d中Shader的一些关于矩阵变换的基本信息
- Unity3d中Shader的一些常用方法
- Shader中矩阵的一些用法
- Unity3D中关于Shader的简单介绍
- 关于Normal的矩阵变换
- Linux中一些基本信息的查看
- 关于Unity3D中的Shader的知识
- 以后我会在这里写一些关于点云、Unity3d、shader、directX学习的文章
- unity3d shader中RenderType的所有类型
- Unity3d中shader属性的控制
- unity3d shader中RenderType的所有类型
- Unity3d shader中RenderType的所有类型
- unity3D中Shader的分类和区别
- unity3D中Shader的分类和区别
- Unity3D中CG/GLSL shader与iPhone shader的区别
- 关于JPEG编码中离散余弦变换的一些理解
- unity3d的shader
- unity3d的shader编程
- <a>标签中href="javascript:;"表示什么意思??
- 深入分析Java ClassLoader原理
- python对象解释说明以及操作实例
- Makefile使用总结
- 文章标题轮播展示
- Unity3d中Shader的一些关于矩阵变换的基本信息
- 15 个 Android 通用流行框架大全
- 巩固高端移动市场地位的同时 三星手机将发力智能创新
- 滑动返回手势的禁用与开启
- VC++ VS2010 MFC 配合串口控件MSCOMM 复选框CheckBox 下拉ComboBox来选择打开串口端口
- HAProxy从零开始到掌握
- [Android学习]蓝牙模块的话里话外
- Java IO(一)
- 能查快递单号轨迹?我用的一定是个假表格