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 ...
随机推荐
- 消息:SQL Server 2017(vNext)的第三个公开的CTP(社区技术预览版)发布了
今天看到了一个新闻,跟大家分享一下,有兴趣的可以去尝试一下. SQL Server 2017 CTP3于5月23日发布了,详细版本号是6.7.55.0. 大家可以去安装试试.在下载页面,目前是SQL ...
- 分布式版本控制git常见问题之gitignore冲突
所见即所得,建议大家用可视化的SourceTree专为git打造的,非常好用,废话不多说了. 原因是有人提交了.gitignore里面的内容,所以和本地的不一样,这样就有问题,那么pull都不可以,所 ...
- 我来谈谈PHP和JAVA的区别
这里的标题写的是谈谈PHP和JAVA的区别,其实是委婉的说法,其实别人是想听PHP好还是JAVA好!!! 从而从中找到存在感!!! 因为由于我是从多年的php开发转到java开发的.所以最,不时的有好 ...
- Libsvm使用资料
原理: 1. pluskid(张弛原)的支持向量机教程(人家现在都是大牛了) http://blog.pluskid.org/?page_id=683 2. JerryLead机器学习教程 http: ...
- IE 不兼容 js indexOf 函数
在使用 js 判断数组中是否存储该元素,我们会用到 indexOf 函数.而在 IE 上 indexOf 函数 无法兼容,通过以下方法解决,仅以文章记录一下 if (!Array.prototyp ...
- python小工具:用python操作HP的Quality Center (二)----- 用异步方式提高速度
上接第一篇 http://www.cnblogs.com/sdet/p/6874631.html 在python中,很简单地能把http请求通过异步的方式发送,以下代码在python 3.6.0上运行 ...
- 学习Spark——那些让你精疲力尽的坑
这一个月我都干了些什么-- 工作上,还是一如既往的写bug并不亦乐乎的修bug.学习上,最近看了一些非专业书籍,时常在公众号(JackieZheng)上写点小感悟,我刚稍稍瞄了下,最近五篇居然都跟技术 ...
- javaSE_06Java中的数组(array)-提高练习
1.求1!+2!+3!+···+30!的和,定义一个方法 public class Test1{ public static void main(String[] args){ //1.求1!+2!+ ...
- DOM知识梳理
DOM 我们知道,JavaScript是由ECMAScript + DOM + BOM组成的.ECMAScript是JS中的一些语法,而BOM主要是浏览器对象(window)对象的一些相关知识的集合. ...
- Unity3d简单的socket通信
vs2010或其他创建C#工程 C#端代码一: using System; using System.Collections.Generic; using System.Linq; using Sys ...