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 ...
随机推荐
- 【SCOI 2008】奖励关
Problem Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关. 在这个奖励关里,系统将依次随机抛出 \(k\) 次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之 ...
- JAVA中的责任链模式(CH02)
对责任链CH01做出优化,解决耦合度太高问题 记得上一篇我们使用的是抽象类,然后用子类去继承的方法实现等级的桥接,从而发现了耦合度太高. 为了解决这个问题. 我们本次使用接口进行抽象,然后使用到一个” ...
- Kotlin 条件控制
IF 表达式 一个 if 语句包含一个布尔表达式和一条或多条语句. // 传统用法 var max = a if (a < b) max = b // 使用 else var max: Int ...
- 简单粗暴的上传项目至 Github
嗯,写了一个项目,觉得还OK,就想放在 Github 继续维护和方便使用,那么如何简单快速的将代码上传至 Github 上? 1. 你得有自己的 Github账号,如何创建账号这里就不说了.因为.. ...
- 用GraphX分析伴生网络(二)
8. 过滤噪声边 在当前的伴生关系中,边的权重是基于一对概念同时出现在一篇论文中的频率来计算的.这种简单的权重机制的问题在于:它并没有对一对概念同时出现的原因加以区分,有时一对概念同时出现是由于它们具 ...
- SWUST OJ(957)
逆置单链表 #include <stdio.h> #include <stdlib.h> typedef struct LNode { char data; struct LN ...
- springboot打成Jar包后部署至Linux服务器上
下面主要记录一下springboot打包成jar包在Linux服务上部署的步骤: 1.通过WinSCP,将相应的Jar文件,复制到Linux指定目录下,如/home/ 2.打开ssh,进入/home目 ...
- Django框架(四)
八.Django 模型层(2) 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息. ...
- IO流的分类
按内容分:字节流和字符流 按流向分:输入流和输出流 字节流: 输入流:InputStream 输出流:OutputStream 字符流: 输入流:FileReader 输出流:FileWriter
- let,const 声明的变量不会绑定给window对象 而var会
先来看一道题 let id = 2; let json = { id: 1, show:function(){ setTimeout(function(){ console.log(this.id); ...