如何系统的学习 Unity 3D 中的 shader 编写
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何系统的学习 Unity 3D 中的 shader 编写相关的知识,希望对你有一定的参考价值。
参考技术A 学习shader的时候,你不仅想知道怎么用,可能还想了解它背后的机制,那这篇文章你肯定不能错过:【Unity Shaders】初探Surface Shader背后的机制
这些都熟练了,对shader也都比较熟悉了。你可以尝试去创造属于自己的shader,也可以去Shadertoy BETA寻求灵感 参考技术B 你需要看书或Unity的联机文档系统的学习和练习,网上有《Unity 着色器和屏幕特效开发秘笈》Kenny Lammers 的中文PDF。本回答被提问者采纳
翻译13 Deferred Shading
探索延迟渲染
G-Buffer
HDR与LDR
Deffered反射
Unity 5.6.6f1
1 Deferred Rendering Path
到目前为止一直使用了Unity的Forward Render Path,现在开始学习Deferred Path,以及对比这两者间的差异
1.1 准备工作
通过Edit/Project Setting/Graphic切换Render Path;
关闭环境光、反射光;
Quality设置阴影质量为最高,方便观察;
启用dynamic batching.
1.2 开始对比Draw Calls
一共有64个Object可见物体组成一个Prefab。
通过对比这个prefab有和没有阴影,分别计算处于ForwardPath和DeferredPath下的Draw Call数。
-------------------------------Use Forward Path--------------------------------
1、No Shadows
没有阴影下,128次几何绘制加1次Clear;1次天空盒绘制;2次屏幕处理绘制,总共132次Draw Call。(如果是使用一个方向光,动态批处理就会生效,就可以少于64个批次绘制)。然而由于有一个额外的方向光,dynamicBatching就不会生效,所以总共绘制两遍。
1.1 Forward,no shadow
2、Enable Shadows
启用阴影后,需要更多的Draw Calls去生成阴影纹理既。分析如下:
首先,填充depth-buffer,需要47次Draw Call,47少于64得益于dynamicBatching;
其次,创建Cascading阴影纹理。第一个光用了110次DC,同时第二个光用了115次DC,这些纹理渲染再屏幕空间screen-space buffer,执行过滤。
最后,每个光绘制一次几何物体,用了128(64*2)次DC。
总共408次Draw Calls。
1.2 Forward,enable shadow
---------------------------Use Deferred Path-------------------------------
1、No Shadows
首先,45次Draw Call渲染GBuffer,这得益于dynamic Batching;
其次,1次Draw Call复制深度纹理;
接着,1次绘制反射和1次自发光反射;
最后,2次光照着色(两个方向光)。
总共52次 = 49次几何绘制; 1次天空盒绘制;2次屏幕处理绘制
1.3 Deferred, no shadows
2、Enable Shadows
与上面1.3的lighting着色不同,用231次Draw Calls绘制。但是其阴影绘制方法与Forward模式是一样的。
1.4 Deffered,enable shadows
---Notice:Deferred不支持MSAA,如果启用Camera组件会有Warning:
延迟着色依赖于每个片段存储的数据,这是通过纹理完成的。 这与MSAA不兼容,因为该抗锯齿技术依赖于子像素数据。 尽管三角形边缘仍然可以从MSAA中受益,但延迟的数据仍会混叠。 您必须依靠一个后处理过滤器来进行抗锯齿。
1.3 分析1.2的对比数据
结论 | 当渲染多个light光时,Deffered着色模式比Forward着色模式的渲染效率更高! | ||
相同 | 两个模式的阴影绘制方法一样 | ||
差异 |
|
以上是关于如何系统的学习 Unity 3D 中的 shader 编写的主要内容,如果未能解决你的问题,请参考以下文章