Unity3d shader编程 Forward渲染路径

原创 2015年07月08日 10:14:17

接着昨天写的Unity3d shader编程 VertexLit渲染路径 今天动笔另一个Camera的渲染模式Forward的shader pass编程
//另外对昨天写的文章进行了稍许的内容增加和解释,以便读者更好理解。


老生重提,学过shader编程的同学应该知道,一个特效的形成是由3部分组成(像魔戒三部曲一样)。物体材质+光源+视摄像机共同渲染的结果。物体材质是我们可以编程的如何接收光,反射,折射等,这一部分涉及物理光学(突然好高大上),计算机靠数学函数模拟光照的特征,计算出光照强度颜色等,最终反映到屏幕上被肉眼接收。那摄像机有vertexlit,forward,deferred三种模式干嘛? 其实摄像机就是统一规定屏幕内的物体都是以什么方式被渲染的,VertexLit顶点方式则全部用物体材质中的vertex path渲染路径去刻画每一个物体,如果(当前显示)摄像机用forward模式,则查找物体材质shader程序中forward base/forward add path去刻画物体,如果找不到则还是用vertex path去刻画。如果(当前显示)摄像机用deferred模式,则查找物体材质shader程序中PrepassBase/PrepassFinal path(这里不是deferred开头额。)方法去刻画物体,找不到则寻找forward base/forward add path去刻画物体,再找不到则使用最低级的vertex path去渲染,再找不到?有个FallBack "Diffuse"就是最终使用unity系统默认渲染方法来渲染..您就甭管了... 

所以摄像机的渲染模式就像一个总开关... 而材质的渲染路径path就是总开关下的各种串并联电路,决定哪种渲染方式合适,而光源有两种光照vertex/pixel和材质渲染路径共同决定如何显示,总不能光源是vertex顶点的,而要求材质渲染用deferred的逐像素点渲染吧?这时候就会自动调整到适合光源的vertex path路径下渲染。。 而vertex顶点渲染硬件开销小..废话么,都不是每个像素点运算的,只是顶点插值出来的均值,所以游戏中主要光源应该用pixel逐像素点刻画,而次要光源(啥叫次要,比如太阳下的小星星,你就自己琢磨吧)就可直接设置成vertex模式的,强制材质物体在使用该光源时使用vertex path渲染来减少运算开销,增加帧率!有舍必有得嘛。 

物体材质+光源+视摄像机的关系全部说完,接下来是正文..序言很长,但必须理清!如果不理解可看完正文回头来看这段解释,深度理解三者关系,才能在写代码时心中有丘壑。

Forward/FowardAdd Pass

这两种渲染路径在摄像机为vertexLit模式下都不被支持,因为他们更高级. 并且FowardAdd是Forward的补充,所以叫Add,如果Forward路径不存在,则ForwardAdd即使被写进去了,也是不被调用得。在摄像机为Forward和Deferred模式下,Forward的pass均能被正常渲染。因为Deferred限定更高级的渲染模式,一旦没找到Deferred相关的PrepassBase/PrepassFinal 的渲染方式则会使用Forwardbase/ForwardAdd就像序言说的那样(什么还没看过?先滚过去通读一遍再回来)。

上文说到三种光源变量在shader pass中被获取(当然先要#include “UnityCG.cginc”,#include “Lighting”)
(1) _WorldSpaceLightPos0/_LightColor0

  1. 光源不存在pixel ——现在这个环境是在Forward pass下,所以该变量能获取才对,(上一章节内容),但是如果光源为vertex则强行改变物体材质的渲染方式降低为vertex渲染方式(但是别误会 不会运行vertex pass),所以_WorldSpaceLightPos0/_LightColor0是获取不到值得。ForwardBase中没有值,ForwardAdd则不会被运行。

  2. 存在pixel平行光没有pixel点光源 ——ForwardBase中_WorldSpaceLightPos0/_LightColor0获取到了值,但是FowardAdd这个高级附加功能依旧没有被运行

  3. 存在pixel点光源没有pixel平行光 ——ForwardAdd Pass包含光源数据且被执行。ForwardBase内_WorldSpaceLightPos0有数据,但是对应_LightColor0没有,所以组合光照(亮度*颜色)还是黑色。等于没用。

  4. 多种类型的Pixel光源时 ——-视情况而定。Pixel平行光被ForwardBase Pass所处理,并且只能处理一个最强亮度的Pixel平行光,即使有很多…剩余其他的Pixel平行光则被推倒ForwardAdd Pass中处理,如果有点光源排在平行光之后处理。(当然都要是Pixel模式的,而且全都会被处理,一一处理,顺序还是亮度强先处理,平行光先处理)。如果没有平行光,只有Pixel点光源的时候,ForwardBase Pass永远只能处理一个光源,而ForwardAdd Pass能处理无限多…理论上。例如有3个Pixel 点光源(即使有平行光也是无效的vertex光源,就和没有一样),亮度最大的点光源被ForwardBase处理,其他点光源被排到ForwardAdd中处理。

(2)unity_4LightPos[X,Y,Z]0 / unity_LightColor[4]

  1. 包含4个Vertex类型的点光源,如果一个个把点光源改成平行光,信息就会从变量中一一消失,Unity会清空该对应数据。

  2. 逐个将Vertex点光源改为Pixel点光源,被改为Pixel点光源的信息会排序靠前!因为Pixel类型的光源相对重要!

  3. 在ForwardAdd Pass内 unity_4LightPos[X,Y,Z]0组合和对应的颜色数据只包含Vertex点光源。注意不要重复计算

(3)unity_LightPosition[4] / unity_LightColor[4] 使用相同的Color变量

  1. 所有情况下都是空数据….
版权声明:本文为博主原创文章,未经博主允许不得转载。

渲染路径-实时渲染中常用的几种Rendering Path

http://www.cnblogs.com/polobymulberry/p/5126892.html?utm_source=tuicool&utm_medium=referral 回到顶...
  • OnafioO
  • OnafioO
  • 2016年07月11日 16:46
  • 2824

Unity3D光照前置知识——Rendering Paths(渲染路径)及LightMode(光照模式)译解

简述 U3D支持不同的Rendering Path(渲染路径),开发者应该根据游戏内容和目标平台,硬件等来选择使用哪个Rendering Path。不同的Rendering Path具有不同的表现效果...
  • kevlis
  • kevlis
  • 2016年11月02日 11:57
  • 4663

unity3d 渲染路径(延迟光照,正向渲染,顶点光照)

转自:http://edu.china.unity3d.com/learning_document/getData?file=/Manual/RenderingPaths.html 渲染路径 ...
  • AK520123456
  • AK520123456
  • 2015年07月08日 14:30
  • 2033

Unity3d shader编程 VertexLit渲染路径

此文仅供参考使用。this is reference not a manual! 所以知识点比较零碎,如果有时间我会整理一下概念,组织一下逻辑,让弱基础的读者理解。顶点照明就是通过计算顶点颜色和光照...
  • zhao_92221
  • zhao_92221
  • 2015年07月07日 14:56
  • 1476

【Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本文介绍了Unity中Shader书写中会用到的剔除、深度测试、Alpha测试以及基本雾效相关的语法知识,然后以6个Shader的书写作为实战内容,最后创建了一个生机勃勃的热带雨林场景进行了Shade...
  • zhmxy555
  • zhmxy555
  • 2014年12月14日 16:49
  • 28659

Unity3D着色器Shader编程入门

自学Unity3D也有大半年了,对Shader一直不敢入坑,最近看了些资料,以及通过自己的实践,对Shader还是有一点了解了,分享下仅作入门参考。     更多精彩请关注【狗刨学习网】 ...
  • Carl180
  • Carl180
  • 2015年02月01日 23:36
  • 441

Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/articl...
  • aasd1m
  • aasd1m
  • 2016年12月07日 16:11
  • 454

【浅墨Unity3D Shader编程】之七 静谧之秋篇: 表面着色器的写法(二)—— 自定义光照模式

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/articl...
  • liangyuqi123456
  • liangyuqi123456
  • 2016年02月19日 10:45
  • 984

Unity3D Shader的几种基本编程方式

本文转载于:http://liweizhaolili.blog.163.com/blog/static/1623074420151595340733/ 过了2个星期,又来继续说着色器...
  • qq_40107590
  • qq_40107590
  • 2017年10月24日 16:15
  • 98

【Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合

本文介绍了Unity中子着色器、通道和标签相关的详细概念与写法,以及纹理的设置方法,基本的纹理混合写法,写了5个Shader作为本文Shader讲解的实战内容,最后创建了一个梦幻的光之城堡场景进行了S...
  • zhmxy555
  • zhmxy555
  • 2014年11月16日 21:05
  • 36797
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3d shader编程 Forward渲染路径
举报原因:
原因补充:

(最多只允许输入30个字)