Rendering Path:渲染路径
  设置:1、Player Setting,2、Camera(会覆盖PlayerSetting中的设置)
  选择:根据渲染内容和目标平台来选择合适的Rendering Path,当一个GPU不能处理Deferred Lighting时,会自动切换到Forward Lighting,当Forward Lighting不支持时,会自动切换到Vertexx Lig。

(1)Vertex Lit:
  最低真实度但也是最快的的渲染路径,不支持realtime shadows,建议用在旧机器或一些移动平台上。
  所有lighting都基于顶点计算光照在一个pass里完成,不支持所有的基于pixel计算的效果,比如:shadows、normal mapping、light cookies、highly detailed specular highlights。

(2)Forward Rendering:
  支持一盏方向光的实时阴影。
  最亮的几盏(QualitySetting)光源按像素计算,然后,最多4盏点光源按照逐顶点计算,剩下的都按照SH计算,具体的影响因素:
  (1)Light.RenderMode = Not Important的光源:按照per-vertex或者SH计算;
  (2)最亮(Light.intensity和距离)的directional light:总是per-pixel;
  (3)Light.RenderMode = Important的光源:总是per-pixel计算;
  (4)QualitySetting.PixelLightCount指定了pixel光照的数量,如果基于上述3个规则所产生的pixel light小于此数量,则会有更多的light按照per-pixel计算,以此来降低亮度。
  SH光照:基于vertex计算,但比vertex light要快,它只是一个近似的计算;
      有一点CPU开销,几乎没有GPU开销,很多个SH light和一个SH light的开销完全一样;
      SH lighting非常低频率,所以不要对SH light做太快的transform,SH light只影响diffuse lighting,由于太慢而不支持specular light。

  渲染每个物体的过程:

    1、Base Pass:应用一个逐像素的方向光、所有的逐顶点或SH的灯光;

      2、Additional Pass:逐个渲染每个逐像素光照,每盏光一个pass。

  同一个场景中每个物体的这4个点光源不一样,并且这4个point光是按照pixel优先的顺序选择的,如下图所示,场景中有很多点光源,但影响每个物体的四盏点光源会根据位置来自动选择:

(3)Deferred Lighting:
  提供最好的光影效果,建议在有很多realtime lights的时候使用,它对硬件有一些要求。
  light数量没有限制,且所有light都per-pixel计算。
  原理:第一步准备N个与屏幕同大小的纹理作为渲染缓冲区,接下来向这个纹理渲染东西,一般用FBO,渲染的时候,把每个象素最终的法线值、位置、纹理信息分别渲染到这N个纹理中。
       第二步进行光照/渲染计算,将把之前得到的纹理中的值作为光照计算的输入值来计算光照。
  不支持Deffered Lighting的shader会自动使用Forward Rendering Path。
  优点:计算光照的计算量与场景复杂程度完全无关(三角形再多也不要紧),只与第一次渲染的像素数量和第二次渲染的光源数量成正比。这样,就可以在有限的硬件资源里使用大量的光源。避免多次(超过1次)渲染同一个像素。
       因为和场景复杂度无关,所以小的point light和spot light的开销都是很小的。
  缺点:1、无法使用基于硬件的抗锯齿,因为每个象素都独立计算;
     2、同时渲染多个纹理,显存压力很大;
      3、没法处理半透明,半透明物体只能提出来单独渲染一次(使用Forward Rendering);
      4、不支持MeshRender的Receive Shadows选项(只支持选中值),culling mask选项只有有限的支持(最多4个culling mask,那么意味着layer mask必须至少包含all layers - 4个layer)。

  实现细节:
    1、base pass:几个屏幕大小的buffer,分别包含depth、normals、specular power信息;
    2、lighting pass:在屏幕空间计算光照(所以开销和场景复杂度无关)并存在一张lighting buffer里,只能使用Blinn-Phong的光照模式。
    3、final pass:生成最终的渲染画面,物体再次被渲染,根据lighting信息、结合color textures和任何ambient/emissive lighting。

  至少需要Shader Model3.0,2004年之后出的显卡基本上都支持延迟渲染。

 (4)渲染路径和Pass的Tag

  Pass的LightMode Tag定义了其在渲染管线中的作用。

    Pass
{
Tags { "LightMode " = "ForwardBase"}
...
}

  Deferred Lighting,使用PrepassBase和PrepassFinal的Pass;  

  Forward Lighting,使用ForwardBase和ForwardAdd的Pass;

    只有ForwardAdd没有ForwardBase时,ForwardAdd不会执行,被忽略。没有平行像素光,ForwardBase输出黑色,ForwardAdd会执行。

  Vertex Lit,使用Vertex、VertexLMRGB和VertexLM的Pass;

    Vertex:无lightmap,应用所有的vertex lights;

    VertexLMRGB:物体应用lightmap,lightmap为RGBM编码的PC和console平台;

    VertexLM:物体应用lightmap,lightmap为double-LDR编码的mobile平台。

    以上3种LightMode同时只会执行一种。

  在任何渲染路径中,渲染阴影是都会使用ShadowCaster和ShadowCollector的Pass。

  Always表示总是渲染,并且不应用光照。

  默认的LightMode为Always,非法的LightMode值,也当做Asways处理。

测试渲染路径的shader:

Shader "James/Other/TestRenderMode_All"
{
Properties
{
_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader
{
Tags { "RenderType"="Opaque" }
LOD
Blend One One /// 延迟渲染部分.begin
CGPROGRAM
#pragma surface surf MyDeferred sampler2D _MainTex; struct Input
{
float2 uv_MainTex;
}; inline fixed4 LightingMyDeferred_PrePass (SurfaceOutput s, half4 light)
{
fixed4 c;
c.rgb = s.Albedo * light.rgb;
c.a = s.Alpha;
return c;
} void surf (Input IN, inout SurfaceOutput o)
{
o.Albedo = float3(, , );
}
ENDCG
/// 延迟渲染部分.end /// 前向渲染部分.begin
pass
{
Tags{"LightMode" = "ForwardBase"}
Blend one one
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc" struct v2f
{
float4 pos : SV_POSITION;
float4 color : COLOR;
}; v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = float4(, , , );
return o;
} float4 frag(v2f i) : COLOR
{
return i.color;
} ENDCG
}
/// 前向渲染部分.end /// 顶点渲染部分.begin
pass
{
Tags{"LightMode" = "Vertex"}
Blend one one
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
#include "Lighting.cginc" struct v2f
{
float4 pos : SV_POSITION;
float4 color : COLOR;
}; v2f vert(appdata_base v)
{
v2f o;
o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = float4(, , , );
return o;
} float4 frag(v2f i) : COLOR
{
return i.color;
} ENDCG
}
/// 顶点渲染部分.end }
FallBack "Diffuse"
}

  上面的代码中,不同的渲染路径会输出不同的颜色,而具体哪个pass生效会根据unity的render path的设置来判断。

Rendering Path的更多相关文章

  1. 【原】实时渲染中常用的几种Rendering Path

    [原]实时渲染中常用的几种Rendering Path 本文转载请注明出处 —— polobymulberry-博客园 本文为我的图形学大作业的论文部分,介绍了一些Rendering Path,比较简 ...

  2. Thinking in Unity3D:渲染管线中的Rendering Path

      关于<Thinking in Unity3D> 笔者在研究和使用Unity3D的过程中,获得了一些Unity3D方面的信息,同时也感叹Unity3D设计之精妙.不得不说,笔者最近几年的 ...

  3. Unity5 的新旧延迟渲染Deferred Lighting Rendering Path

    unity5 的render path ,比4的区别就是使用的新的deferred rendering,之前的4的deferred rendering(其实是light prepass)也被保留了下来 ...

  4. Unity 的“Vertex Lit Rendering path“中 shader Pass 的注意事项

    "MADFINGER/Environment/Unlit (Supports Lightmap)"是 ShadowGun 示例中最简单的 shader 了,如下: // Unlit ...

  5. Unity shader学习之Forward Rendering Path

    Forward rendering path shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObje ...

  6. 前向渲染路径细节 Forward Rendering Path Details

    正向渲染路径细节 Forward Rendering Path Details Forward Rendering path renders each object in one or more pa ...

  7. Unity Lighting - Choosing a Rendering Path 选择渲染路径(三)

      Choosing a Rendering Path 选择渲染路径 Unity supports a number of rendering techniques, or ‘paths’. An i ...

  8. 渲染路径-Unity5 的新旧推迟渲染Deferred Lighting Rendering Path

    Unity5 的新旧延迟渲染Deferred Lighting Rendering Path unity5 的render path ,比4的区别就是使用的新的deferred rendering,之 ...

  9. 正向渲染路径细节 Forward Rendering Path Details

    http://www.ceeger.com/Components/RenderTech-ForwardRendering.html This page describes details of For ...

随机推荐

  1. SQLSERVER新建表的时候页面分配情况是怎样的?

    SQLSERVER新建表的时候页面分配情况是怎样的? 再次感谢sqlskill网站和转载sqlskill网站文章并翻译的人,因为您们的转载和翻译让小弟又学习到新的东西o(∩_∩)o 文章中用到的工具: ...

  2. 从此爱上iOS Autolayout

    转:从此爱上iOS Autolayout 这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程 ...

  3. How to use “svn add” recursively in Linux shell?

    This command will add any un-versioned files listed in svn st command output to subversion. Note tha ...

  4. SQL行转列和列转行

    行列互转,是一个经常遇到的需求.实现的方法,有case when方式和2005之后的内置pivot和unpivot方法来实现. 在读了技术内幕那一节后,虽说这些解决方案早就用过了,却没有系统性的认识和 ...

  5. HOWTO - 压缩封装的Setup.exe(纯MSI)安装包获取运行Log

    在InstallShield中我们有时即使选择Basic MSI工程,但有时还是将MSI封装到Setup.exe中交付. 那么出现运行异常如何获取Log,可以用下面的方法: Setup.exe /v& ...

  6. spring中使用mockito

    1 mockito介绍和入门 官方:https://github.com/mockito/mockito 入门: 5分钟了解Mockito http://liuzhijun.iteye.com/blo ...

  7. DataGridView隔行显示不同的颜色

      如果该dataGridView是跟数据库绑定的,则可以触发DataBindingComplete事件:  1private   void   dataGridView1_DataBindingCo ...

  8. 文件系统管理 之 实例解说 fdisk 使用方法

    一.fdisk 的介绍: fdisk - Partition table manipulator for Linux ,译成中文的意思是磁盘分区表操作工具:本人译的不太好,也没有看中文文档:其实就是分 ...

  9. 解决Win7旗舰版开机后无线网络识别非常慢的问题

    最近电脑开机后WIFI识别和连接非常慢,不知何故.查看百度安全卫士的优化记录,发现其禁用了 Network List Service,将该服务设为自动启动,重启服务后,问题解决.PS:如此优化太可恶!

  10. wwdc2016-session707 Notifications(draft)

    Introduction to Notificationshttps://developer.apple.com/wwdc2016/707 通知这哥们说话有点不清晰啊. 远程通知本地通知 可以被操作的 ...