Unity Shader入门精要读书笔记(三)Shader必须的数学基础
Xyz三维坐标系如下:左手坐标系

但是摄像机观察空间则是采用右手系:

右手法则判断叉乘的结果的方向;
正交矩阵(单位互相垂直的基矢量构成正交矩阵)具有逆与转置一致性;
列矩阵运算CBAv和行矩阵的运算vATBTCT一致;
平移变换不是一个线性变换;
仿射变换合并了线性变换和平移变换,在齐次坐标空间中进行;
纯平移、纯旋转和纯放缩的变换称为基础变换,那么一个齐次坐标矩阵如下:

其中M表示缩放和旋转,t表示平移,0表示0,1表示1;
为什么呢?

从C空间变到P空间的矩阵:

其中Oc是选取的原点,xcyczc是C下的P的基矢量(不一定要是单位的);
对于矢量从C空间变到P空间中,则只需要:

如果是正交矩阵的话,可以轻易地得到反推的矩阵(读取行即可);
[正交矩阵] 利用试探法写MA->B,已知B空间的基矢量是xbybzb(用A来描述),那么xb(用A系来描述B的x基矢量)经过A到B的转换后,得到的应该是100;

模型变换:从模型空间到世界空间;
先缩放、后旋转、后平移;
摄像机的放置:缩放(不缩放)、旋转(镜头的旋转)、平移(镜头的平移),即摄像机有一个transform;由于观察空间是一个右手系,所以对z进行取反,即和[1000; 0100 ;00-10 ; 0001]相乘,得到观察变换矩阵,也就是以镜头位置为原点,以镜头指向为坐标轴(其中镜头后方为+z)的坐标系;
齐次裁剪空间,这个空间的变换矩阵称为裁剪矩阵或者投影矩阵;
利用三角形关系和FOV可以知道近裁平面和远裁平面的高度


Aspect是宽高比,那么从观察空间(摄像机做原点)到裁剪空间为:

经过裁剪变换后,所有不满足xyz限定在±w内的片元都被丢弃;

正交投影的裁剪变换如下:


所有不满足xyz在±1以内的,都被裁剪;
透视除法:就是用w分量去除以xyz分量(限定在了-1到1的立方体内)

正交投影的齐次除法就是除以1:

在Unity中屏幕空间左上角是原点,右下角是pixelW和pixelH,那么就有最后一个从齐次除法后到屏幕映射:

其中clipx是裁剪空间中的x,clipw是裁剪空间中的w;

为了将法向量从A空间变换到B空间,直接和Mab相乘是不对的。变换到B切线方向记为Tb,Nb记为变换到B的法线方向,那么满足点积为零的约束:(我们希望求得G表示法线从A到B的变换矩阵)
如果Mab是正交矩阵(即旋转),那么直接和Mab相乘是正确的,如果带有统一放缩k,那么;
Unity Shader入门精要读书笔记(三)Shader必须的数学基础的更多相关文章
- Unity Shader入门精要读书笔记(一)序章
本系列的博文是笔者读<Unity Shader入门精要>的读书笔记,这本书的章节框架是: 第一章:着手准备. 第二章:GPU流水线. 第三章:Shader基本语法. 第四章:Shader数 ...
- Unity Shader入门精要读书笔记(二)UnityShader概述
第三章<UnityShader概述>的读书笔记: 1.Unity Shader模板提供了几种选择: 标准光照模型(新添加的基于物理的渲染方法) 不含光照的基本的顶点.片元着色器 屏幕后处理 ...
- GitHub入门与实践 读书笔记三:(1)GitHub账户注册教程
第一步:进入GitHub官网,官网地址:https://github.com/ 第二步:点击Sign up for GitHub 1.昵称一栏:每次在你输入昵称之后,都会检查是否已经被注册.如果被注册 ...
- Unity Shader入门精要学习笔记 - 第10章 高级纹理
转载自 冯乐乐的 <Unity Shader入门精要> 立方体纹理 在图形学中,立方体纹理是环境映射的一种实现方法.环境映射可以模拟物体周围的环境,而使用了环境映射的物体可以看起来像镀了层 ...
- Unity Shader入门精要学习笔记 - 第9章 更复杂的光照
转载自 冯乐乐的<Unity Shader入门精要> Unity 的渲染路径 在Unity里,渲染路径决定了光照是如何应该到Unity Shader 中的.因此,如果要和光源打交道,我们需 ...
- Unity Shader入门精要学习笔记 - 第8章 透明效果
转载自 冯乐乐的 <Unity Shader入门精要> 透明是游戏中经常要使用的一种效果.在实时渲染中要实现透明效果,通常会在渲染模型时控制它的透明通道.当开启透明混合后,当一个物体被渲染 ...
- Unity Shader入门精要学习笔记 - 第7章 基础纹理
转自 冯乐乐的 <Unity Shader 入门精要> 纹理最初的目的就是使用一张图片来控制模型的外观.使用纹理映射技术,我们可以把一张图“黏”在模型表面,逐纹素地控制模型的颜色. 在美术 ...
- Unity Shader入门精要学习笔记 - 第6章 开始 Unity 中的基础光照
转自冯乐乐的<Unity Shader入门精要> 通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3种物理现象. 首先,光线从光源中被发射出来. 然后,光线和场景中的一些物体相交 ...
- Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础
摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...
随机推荐
- GO学习笔记:函数作为值、类型
在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型: type typeName func(input1 inputType1 , inpu ...
- android开发环境:使用Android Studio搭建Android集成开发环境(图文教程)
开发环境情况: 物理机版本:Win 7旗舰版(64位) Java SDK版本:jdk1.8.0_25(64位) Android SDK版本:Android 7.1(API 25) Android St ...
- 23-THREE.JS 光照材质
<!DOCTYPE html> <html> <head> <title></title> <script src="htt ...
- LeetCode OJ:First Bad Version(首个坏版本)
You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...
- 2017.11.4 Datasheet 查找替代料
- 【python】使用asyncore进行异步通信
参考博文:http://blog.csdn.net/livefun/article/details/8721772 参考博文:https://www.cnblogs.com/tomato0906/ar ...
- opencv 边界确定函数
多边形逼近,用嘴贴切的多边形标识 void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool c ...
- Linux命令学习笔记目录
Linux命令学习笔记目录 最近正在使用,linux,顺便将用到的命令整理了一下. 一. 文件目录操作命令: 0.linux命令学习笔记(0):man 命令 1.linux命令学习笔记(1):ls命令 ...
- 第一章 Linux系统入门
设定目标,寻求方法,勤奋努力,坚持不懈. ------你们知道了,而我们做到了.------ 世界上第一台计算机:ENIAC(埃尼亚克).1946-2 宾夕法尼亚大学. 约翰·冯·诺依曼体系 电脑的组 ...
- I.MX6 fbset 使用
/****************************************************************************** * I.MX6 fbset 使用 * 说 ...