Unity-Shader-动态阴影(上) 投影的矩阵变换过程
【旧博客转移 - 2017年1月20日 01:20 】
前面的话
最近很长时间没写博文了,一是太忙 ( lan ) 了,二是这段时间又领悟了一些东西,脑子里很混乱,不知道从何写起。但感觉不能再拖延下去了,来不及解释了,快上车(一脸滑稽)
目前我在做一款3D二次元动作游戏,后面可能会用到动态阴影,有的人可能会直接找一个插件分分钟就把阴影做出来了,这样做当然可以,但自己不去熟悉一下底层原理只是使用工具的话,很难知道性能瓶颈在哪,如果要做一些改动,只能跟策划说:改不了咯
先看效果
这个菊花是投影到地上的,这样的平地可能感觉不出来什么是投影

但是像这样遇到凹凸地形的时候就会明显了,菊花不会直接插入平地,而是贴在球体的表面,就像一个投影机把幻灯片照上去的感觉

实现原理

如上图所示,左边的图是一个顶点渲染到我们的屏幕上要经过这么多的矩阵变换,这里来复习下MVP变化
顶点从模型坐标空间转换到世界坐标空间 X ModelMaterix
然后从世界坐标空间转换到视点空间 X CameraViewMaterix
再从视点空间转换到裁剪空间 X CameraProjectionMatrix
经过其次空间变化后就到了NDC空间,最后到了屏幕空间
经过这些步骤,一个顶点就确定了在屏幕上的位置
右边是将视点当作投影机,根据模型空间的坐标求出投影纹理的坐标的流程,两边前面的步骤都差不多,但是计算投影纹理坐标需要将投影顶点坐标归一化到【0 ,1 】空间中,实现这一步,可以在需要左乘矩阵normalMatrix , 也可以在着色程序中对顶点投影坐标的每个分量先乘以1/2 然后再加上1/2

总结出投影坐标的矩阵公式为:
textViewProjMatrix = NormalMatrix x ProjectionMatrix x ViewMatrix x WorldMatrix
而Unity的Shader中已经为我们算好了这个矩阵,叫做unity_Projector
我们只需要在vext函数中把顶点左乘这个矩阵就得到了齐次投影纹理坐标
o.proj = mul(_Projector, v.vertex);
使用的时候还需要除以最后一个分量w
o.proj.xy = o.proj.xy / o.proj.xy.w;
当然也可以使用CG里的函数tex2DProj进行纹理采样也是一样的
tex2DProj 函数与 tex2D 函数的区别就在于:前者会对齐次纹理坐标除以最后一个分量 q ,然后再进行纹理检索
总结
现在我们知道了投影纹理是如何计算出来的,矩阵的变化过程是怎样的。但是这个Shader是运行在谁身上呢?是在地形上,还是在球上?这个问题我现在也不知道..但是后面我会继续去研究把这个搞懂,然后写一个动态阴影出来
Unity-Shader-动态阴影(上) 投影的矩阵变换过程的更多相关文章
- 游戏里的动态阴影-ShadowMap实现原理
		ShadowMap是比较流行的实时阴影实现方案,原理比较简单,但真正实现起来还是会遇到很多问题的,我这里主要记录下实现方式 先看效果 凹凸地形上也有阴影 实现原理 ShadowMap技术是从灯光空间用 ... 
- Unity Shader基础
		Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ... 
- 【Unity Shader】(六) ------ 复杂的光照(上)
		笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题. [Unity Sha ... 
- Unity Shader 阴影
		最近在看Unity shader开发实战详解,刚开始看阴影部分,稍微有了点思路.在这里写点笔记,算是小结吧. .阴影实现方法 一种是通过模拟光照的原理,用向量的方法 找到被光线照射的点 映射到平面的位 ... 
- 【转】《Unity Shader入门精要》冯乐乐著 书中彩图
		为方便个人手机学习时候查阅,从网上转来这些彩图. 如属过当行为,联系本人删除. 勘错表 http://candycat1992.github.io/unity_shaders_book/unity_s ... 
- Unity Shader入门精要学习笔记 - 第16章 Unity中的渲染优化技术
		转自冯乐乐的 <Unity Shader 入门精要> 移动平台的特点 为了尽可能一处那些隐藏的表面,减少overdraw(即一个像素被绘制多次),PowerVR芯片(通常用于ios设备和某 ... 
- 【我的书】Unity Shader的书 — 文件夹(2015.12.21更新)
		写在前面 感谢全部点进来看的朋友.没错.我眼下打算写一本关于Unity Shader的书. 出书的目的有以下几个: 总结我接触Unity Shader以来的历程,给其它人一个借鉴.我非常明确学Shad ... 
- Unity Shader 知识点总结(一)
		在学习了一段时间的Unity Shader后,打算写一些知识总结,便于今后的查找.如有错误,希望大家指出更改. 本文参照的unity入门精要一书,做一个知识归纳,如有兴趣可以看看其开源的部分,是一本比 ... 
- 【我的书】Unity Shader的书 — 目录(2016.5.19最后一次更新)
		写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shad ... 
随机推荐
- 开涛spring3(8.1) - 对ORM的支持 之 8.1 概述
			8.1 概述 8.1.1 ORM框架 ORM全称对象关系映射(Object/Relation Mapping),指将Java对象状态自动映射到关系数据库中的数据上,从而提供透明化的持久化支持,即把 ... 
- unity 在安卓个IOS平台上  同一个按钮  点击后实现不同的功能
			#if UNITY_IOS UIEventListener.Get(mSprites["Recharge"].gameObject).onClick = OnIOSRecharge ... 
- WCF(远程服务器返回错误: 400 错误的请求)
			类似相关问题有以下: WCF- restful接口 POST方式调用报错(远程服务器返回错误: 400 错误的请求) WCF Rest:不使用UriTemplate使用post方式传参解决HTTP40 ... 
- sh脚本异常,binsh^M bad interpreter No such file or directory
			错误 在Linux中执行.sh脚本,出现如下异常 /bin/sh^M: bad interpreter: No such file or directory 原因 在windows系统中编辑的.sh文 ... 
- 刨根究底字符编码之七——ANSI编码与代码页(Code Page)
			ANSI编码与代码页(Code Page) 一.ANSI编码 1. 如前所述,在全世界所有国家和民族的文字符号统一编码的Unicode编码方案问世之前,各个国家.民族为了用计算机记录并显示自己的字符, ... 
- 刨根究底字符编码之十一——UTF-8编码方式与字节序标记
			UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基 ... 
- PowerShell管道入门,看看你都会不(管道例子大全)
			PowerShell的一个重中之重的功能就是管道(pipeline),本文从浅入深,一步一步详解管道的使用方法和例子,来看看有没有你所不知道的吧,如果全知道,恭喜你已经很厉害啦--适用于所有Power ... 
- 7.ReadWriteLock接口及其实现ReentrantReadWriteLock
			Java并发包的locks包里的锁基本上已经介绍得差不多了,ReentrantLock重入锁是个关键,在清楚的了解了同步器AQS的运行机制后,实际上再分析这些锁就会显得容易得多,这章节主讲另外一个重要 ... 
- JQuery--Ajax 异步操作  动态添加节点 (新人试水,求支持)
			异步操作动态添加节点,导致在代码中给添加的节点全局绑定事件或者获取元素无效,上代码: $(function () { var IP = '...'; // 页面中的默认编号起始值 和 公用IP前缀 s ... 
- struts2+hibernate+spring配置版框架搭建以及简单测试(方便脑补)
			为了之后学习的日子里加深对框架的理解和使用,这里将搭建步奏简单写一下,目的主要是方便以后自己回来脑补: 1:File--->New--->Other--->Maven--->M ... 
