Unity Shader 矩阵基本信息
基本信息
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):
| 名称 | 说明 |
|---|---|
| UNITY_MATRIX_MVP | 当前模型视图投影矩阵 |
| UNITY_MATRIX_MV | 当前模型视图矩阵 |
| UNITY_MATRIX_V | 当前视图矩阵 |
| UNITY_MATRIX_P | 当前的投影矩阵 |
| UNITY_MATRIX_VP | 当前视图投影矩阵 |
| UNITY_MATRIX_T_MV | 模型视图矩阵的转置 |
| UNITY_MATRIX_IT_MV | 模型视图矩阵的逆转置 |
| _Object2World | 当前模型矩阵 |
| _World2Object | 当前世界矩阵的逆矩阵 |
这里要特别说明一下UnityObjectToClipPos(v.vertex)) 方法,官方网站上说明,在写Instanced Shader时,通常情况下并不用在意顶点空间转换,因为所有内建的矩阵名字在Instanced Shader中都是被重定义过的,如果直接使用UNITY_MATRIX_MVP,会引入一个额外的矩阵乘法运算,所以推荐使用UnityObjectToClipPos / UnityObjectToViewPos函数,它们会把这一次额外的矩阵乘法优化为向量-矩阵乘法。
相机
| 名称 | 类型 | 数值 |
|---|---|---|
| _WorldSpaceCameraPos | float3 | 世界空间相机的位置 |
| _ProjectionParams | float4 | x = 1.0(或如果当前使用翻转投影矩阵渲染则为-1.0),y是相机的近平面,z是相机的远平面,w是1 / FarPlane |
| _ScreenParams | float4 | x是相机的渲染目标在像素里的宽度,y是相机的渲染目标在像素里的高度,z是1.0 + 1.0 /宽度和w是1.0 + 1.0 /高度 |
| _ZBufferParams | float4 | 用于线性化Z缓冲区的值。x(1-far /near),y(far/near)、z(x /far)和w(y /far) |
| unity_OrthoParams | float4 | x是正交的相机的宽度,y是正交的相机的高度,z是未使用的,为正交的相机时w为1.0,透视相机时w为0.0 |
| unity_CameraProjection | float4x4 | 摄像机的投影矩阵 |
| unity_CameraInvProjection | float4x4 | 摄像机的投影矩阵的逆矩阵 |
| unity_CameraWorldClipPlanes[6] | float4 | 相机锥平面世界空间方程,按顺序为:左、右、底部、顶部、近、远 |
光照
| 名称 | 类型 | 数值 |
|---|---|---|
| _LightColor0(Lighting.cginc中声明) | fixed4 | 光照颜色 |
| _worldspacelightpos0 | float4 | 方向光:(世界空间方向,0)。其他光:(世界空间位置,1) |
| _LightMatrix0(AutoLight.cginc声明) | float4x4 | world-to-light矩阵。用于样品cookie 和衰减纹理 |
| unity_4LightPosX0、unity_4LightPosY0 unity_4lightposz0 | float4 | (仅ForwardBase通道)前四个不重要的点光源的世界空间坐标 |
| unity_4lightatten0 | float4 | (仅ForwardBase通道)前四个不重要的点光源的衰减系数 |
| unity_lightcolor | half4[4] | (仅ForwardBase通过)前四个不重要的点光源的颜色数组 |
在Shader的光照通道里的延迟着色和延迟光照(在unitydeferredlibrary.cginc):
| 名称 | 类型 | 数值 |
|---|---|---|
| _LightColor | float4 | 光照颜色 |
| _LightMatrix0 | float4x4 | world-to-light矩阵。用于样品cookie 和衰减纹理 |
多光源下,最多8个光源在顶点通道,排序为从最亮的开始
| 名称 | 类型 | 数值 |
|---|---|---|
| unity_LightColor | half4[8] | 光照颜色数组 |
| unity_LightPosition | float4[8] | 视图空间光源的位置。方向光源的坐标是(-方向,0);(位置,1)用于点/点指示灯,点光源,聚光灯的坐标是(位置,1) |
| unity_LightAtten | half4[8] | 光源衰减的系数。X是cos(spotAngle/2)或非聚光灯为-1;Y为1/COS(spotangle / 4)或非聚光灯为-1;Z是衰减的二次方;W是正方形光源的范围 |
| unity_SpotDirection | float4[8] | 视图空间聚光灯的位置;(0,0,1,0)则非聚光灯。 |
Unity Shader 矩阵基本信息的更多相关文章
- 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ...
- Unity Shader 知识点总结(二)
紧接着上一篇文章的shader入门知识的总结,本文主要总结shader中的纹理贴图.透明度混合.顶点动画.后期特效处理等操作.如果有什么地方有错,请指出更正,谢谢.本文的代码主要来自开源书:unity ...
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ...
- 【Unity Shader】---常用帮助函数、结构体和全局变量
[Unity Shader]---常用帮助函数.结构体和全局变量 一.内置包含文件 Unity中有类似于C++的包含文件.cginc,在编写Shader时我们可以使用#include指令把这些文件包含 ...
- 小强学渲染之Unity Shader编程HelloWorld
第一个简单的顶点vert/片元frag着色器 1)打开Unity 5.6编辑器,新建一个场景后ctrl+s保存命名为Scene_5.默认创建的场景是包含了一摄像机,一平行光,且场景背景是一天空盒而 ...
- Unity Shader 入门精要学习 (冯乐乐 著)
第1篇 基础篇 第1章 欢迎来到Shader的世界 第2章 渲染流水线 第3章 Unity Shader 基础 第4章 学习Shader所需的数学基础 第2篇 初级篇 第5章 开始Unity Shad ...
- 【Unity Shader】从NDC(归一化的设备坐标)坐标转换到世界坐标的数学原理
从NDC(归一化的设备坐标)坐标转换到世界坐标要点 参考资料 How to go from device coordinates back to worldspace http://feepingcr ...
- 【Unity Shader】(九) ------ 高级纹理之渲染纹理及镜子与玻璃效果的实现
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Shader](三) ----- ...
- 【Unity Shader】(七) ------ 复杂的光照(下)
笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ...
随机推荐
- Ubuntu如何自定义tftp服务根目录
答:修改/etc/default/tftpd-hpa中的TFTP_DIRECTORY即可,默认TFTP_DIRECTORY="/var/lib/tftpboot"
- Odd Gnome【枚举】
问题 I: Odd Gnome 时间限制: 1 Sec 内存限制: 128 MB 提交: 234 解决: 144 [提交] [状态] [命题人:admin] 题目描述 According to t ...
- Java(1)JDK安装
1.安装JDK开发环境 下载网站:http://www.oracle.com/ 开始安装JDK: 修改安装目录如下: 确定之后,单击"下一步". 注:当提示安装JRE时,可以选择不 ...
- _mount_allowed
该表配置可以坐骑的使用区域,可能需要修改spell.dbc,允许在室内等特殊区域使用坐骑技能
- python 获取文件目录位置
test.py import os print('***获取当前目录***') print(os.getcwd()) print(os.path.abspath(os.path.dirname(__f ...
- Oracle 12c RAC
前提环境(ip,内核参数,环境变量,存储等等...)已准备好. (一) 安装grid 1. Grid用户登录上传并解压 上传linuxx64_12201_grid_home.zip至/u01/ ...
- Symbol Vs String
最重要区别 1 symbol存入内存后,始终存在,如果不进行垃圾收集,可能导致内存泄漏. String只会存在于某个创建它的作用域内.即有生命周期的. 2.唯一性. \\进入控制台 >" ...
- mapping values are not allowed in this context at line 115 column 10
/opt/vagrant/embedded/lib/ruby//psych.rb::in `parse': (<unknown>): mapping values are not allo ...
- mybatis_generator合并xml和Java
之前写了合并xml的插件,今天改了改mybatis-generator源码,合并java和xml都改进去了. 先上图吧. 左边是一开始生成的,中间去掉author加了password字段和方法,右边重 ...
- TCP/IP协议网络编程以及UDP和TCP之传输协议
1.什么是TCP/IP协议? 网络编程协议有很多,目前应用最广泛的是TCP/IP协议(Transmission Control Protocal/Internet Protoal 传输控制协议/英特网 ...