在Unity中为顶点/片段着色器添加阴影
2018-01-08 15:56
357 查看
冷雨
博客园首页
新随笔
联系
订阅
管理
随笔 - 0 文章 - 38 评论
- 21
在Unity中为顶点/片段着色器添加阴影
译文
大部分情况下当我们使用Unity的表面着色器的时候,就已经拥有阴影了。但是有时候因为某些原因你不想使用表面着色器,而是想创建你自己的顶点/片段着色器。这样做最大的好处是一切皆由你控制,但是这同时也是它的缺点:你将不得不自己处理Unity在表面着色器里为你处理好的很多东西。其中一件事就是多重光照和阴影。幸运的是,Unity提供了解决的办法!怎么做?文档中关于这一点所言甚少。我也和很多处在类似处境的人一样对于如何让顶点/片段着色器拥有阴影感到困惑。我Google了一些相关资料,虽然得到的信息不能解决我的问题,却也给了我不少指引。我还查看了一个编译后的表面着色器,试图找出他们是如何添加阴影的。所有这些工作加在一起,再加上一些尝试,最后终于成功了!现在让我来和对此感兴趣的人分享这一切吧。
在开始之前,我得提早指出——当你使用表面着色器的时候,Unity为你做了很多工作;其中一件事当你使用 deffered 或 forward渲染时的内部处理。当你使用自己的顶点/片段着色器的时候,你得把这一点计算在内。实际上,我只需要应付forward渲染这一种情况,并且只对deffered渲染做了简短的测试。虽然在deffered渲染模式下没出什么差错,但是我并不保证它在此模式一切正常。请牢记这点。
我们来看看这个漫反射的shader。它能够投射(和接受)阴影。
首先你得定义 pass里的一个Tag : LightMode。
接下来我们要定义:
为了获得阴影,我们还需要一些额外的代码/宏。所以我们得把AutoLight.cginc 包括进来。
让Unity生成/包含 所需的参数来对阴影进行采样。
使用正确的数据来填充这些参数。
获取最终值。
要让Unity“生成”我们所需的值,我们所需做的就是在顶点到片段的结构体中添加 LIGHTING_COORDS 指令。
下一步是顶点着色器。光有这些参数还不够,我们还得提供正确的数据。Untiy提供了另一个指令以便在正确的情况下填充正确的数据 ——TRANSFER_VERTEX_TO_FRAGMENT。这个指令必须在返回 v2f 结构体之前定义。所以顶点着色器如下:
现在我们只剩下创建我们的片段着色器并且使用LIGHT_ATTENUATION指令来返回正确的最终值了。你可以像平时一样使用 attenuation 值。在漫反射shader里我把它用在漫反射计算中了。就像这样:
对了,还有一件小事要处理。如果要让Unity投射/接受阴影,你必须提供一个 shadow receiver 和 shadow caster通道。我这里没有提供这些。我只是加了一个提供了这些通道的 fallback shader。那样我就用不着自己添加这些通道,令shader的体积变大。当然,你还可以把这些代码放到一个 .cginc 文件里,或者干脆放到最底部,眼不见为净。不过现在来讲简简单单的加一个 fallback 就能工作的很好了。
我希望这些内容能对那些试图在自己的着色器里面添加阴影的人有所帮助。有任何问题请给我评论!
原文地址:http://www.gamedev.net/page/resources/_/technical/graphics-programming-and-theory/let-there-be-shadow-r3642
蛮牛发布地址:http://www.manew.com/thread-41638-1-1.html
相关文章推荐
- unity 固定管线shader转换到顶点片段着色器
- Unity Shader:细分着色器(Tessellation Shader)在顶点与片段着色器中的写法以及各参数变量解释。
- 概要:Unity Cg 编程(关于顶点与片段着色器)
- UnityShader官方案例之编写顶点和片段着色器
- Unity Shader入门精要笔记(六):由一个简单的顶点/片元着色器谈起
- unity之给某个动作片段添加音频文件
- [UnityShader]顶点片段着色器实例(一)
- stage3D基础二-----顶点和片段着色器(转)
- Unity顶点着色器和片段着色器
- 增加顶点和片段着色器
- 顶点和片段着色器
- unity shader 可编程管线(二) 顶点和片段着色器(Vertex Shader and Fragmet Shader)
- [unity 基础教程]给着色器shader添加透明属性
- flash3D开发基础------- 顶点和片段着色器2(转)
- Shader山下(十四)顶点片段着色器处理光照
- 【Unity Shader学习笔记】(二)最基本的顶点片段着色器
- Unity着色器和屏幕特效开发秘籍 顶点-片元着色器实现系列-BasicDiffuse
- android学习10——对顶点着器和片段着色器的理解
- Ogre参考手册(四)3.1.4-3.1.14 声明顶点、几何、片段程序(Ogre着色器脚本)
- Unity Shader 学习笔记(十三)表面着色器的顶点动画