untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd
来源:互联网 发布:python开发的网站源码 编辑:程序博客网 时间:2024/06/11 19:36
第7章 Forward渲染路径
本章的主要目的是让大家在不使用Unity的Surface Shader时,也能够正确地存取Unity的光源数据,从而定制自己的Forward渲染路径的Shader。如果读者没有这个需求,或者己经了解了Unity是如何为Forward渲染路径存放光源数据的,那么就可以跳过本章。
7.1ForwardBase和ForwardAdd
ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass,其中ForwardBase会先于ForwardAdd被执行。这两种类型的Pass在Forward渲染路径下有着不同的光照处理功能。在具体讲解Forward的Pass之前,我们首先来检查一下这两种不同的Forward Pass在不同渲染路径下的表现。
7.1.1设计检测用的场景和材质
FwdAdd.shader的主要代码如下:
我们编译运行一下,根据上面图中所示的结果,在VertexLit渲染模式下, ForwardBase和FowardAdd的LightMode都不被支持。另外,FwdAddX.shader在3个渲染路径下都没有输出,这说明ForwardAdd这个Pass需要和ForwardBase一起使用,否则会被Unity所忽视掉。在Forward和Deferred渲染路径下,Forward的Pass均能被正常渲染。
本章的主要目的是让大家在不使用Unity的Surface Shader时,也能够正确地存取Unity的光源数据,从而定制自己的Forward渲染路径的Shader。如果读者没有这个需求,或者己经了解了Unity是如何为Forward渲染路径存放光源数据的,那么就可以跳过本章。
7.1ForwardBase和ForwardAdd
ForwardBase和ForwardAdd是专门为在Forward渲染路径下渲染物体而设计的两种Pass,其中ForwardBase会先于ForwardAdd被执行。这两种类型的Pass在Forward渲染路径下有着不同的光照处理功能。在具体讲解Forward的Pass之前,我们首先来检查一下这两种不同的Forward Pass在不同渲染路径下的表现。
7.1.1设计检测用的场景和材质
打开Lab_0下的场景,如图所示。这场景里有3个RenderingPath,分别为VertexLit,Forward以及Deferred的相机,而且场景里有足够丰富的平行光、点光源、Pixel光源、Vertex光源。
第一排小球应用的是Lab 0/ Shader下的材质FwdBase.shader,只是在LightMode= ForwardBase的Pass内输出一个(0, 0.5, 1.0, 1.0)的蓝色,第三排小球使用的是FwdAddX.shader,在LightMode = ForwardAdd的Pass内输出一个(1.0,0,0,1.0)的红色,第三排小球应用的是FwdAdd.shader,单单在LightMode = ForwardAdd的Pass内输出一个(1.0, 0.5, 0,1.0)的橘黄色。
Shader "Tut/Lighting/Forward/Lab_0/FwdBase" {SubShader {pass{//这个Pass只是被用来数出一个确定的颜色,用来检查这种类型的Pass在不同渲染路径下的表现Tags{ "LightMode"="ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma multi_compile_fwdbase#include "UnityCG.cginc"#include "Lighting.cginc"struct vertOut{float4 pos:SV_POSITION;float4 color:COLOR;};vertOut vert(appdata_base v){vertOut o;o.pos=mul(UNITY_MATRIX_MVP,v.vertex);o.color=float4(0,0.5,1,1);//输入固定的蓝色return o;}float4 frag(vertOut i):COLOR{return i.color;}ENDCG}//end pass}}
FwdAdd.shader的主要代码如下:
Shader "Tut/Lighting/Forward/Lab_0/FwdAdd" {SubShader {pass{Tags{ "LightMode"="ForwardBase"}CGPROGRAM#pragma multi_compile_fwdbase#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct vertOut{float4 pos:SV_POSITION;float4 color:COLOR;};vertOut vert(appdata_base v){vertOut o;o.pos=mul(UNITY_MATRIX_MVP,v.vertex);o.color=float4(0,0.5,1,1);//蓝色return o;}float4 frag(vertOut i):COLOR{return i.color;}ENDCG}//end passpass{Tags{ "LightMode"="ForwardAdd"}Blend One Zero//通过这种混合方式消去ForwardBase的影响CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"#include "Lighting.cginc"struct vertOut{float4 pos:SV_POSITION;float4 color:COLOR;};vertOut vert(appdata_base v){vertOut o;o.pos=mul(UNITY_MATRIX_MVP,v.vertex);o.color=float4(1,0.5,0,1);//输出固定的橘黄色return o;}float4 frag(vertOut i):COLOR{return i.color;}ENDCG}//end pass}}FwdAddX.shader的主要代码如下:
SubShader {pass{Tags{ "LightMode"="ForwardAdd"}CGPROGRAM#pragma vertex vert#pragma fragment frag//#pragma multi_compile_fwdadd#include "UnityCG.cginc"#include "Lighting.cginc"struct vertOut{float4 pos:SV_POSITION;float4 color:COLOR;};vertOut vert(appdata_base v){vertOut o;o.pos=mul(UNITY_MATRIX_MVP,v.vertex);o.color=float4(1,0,0,1);//输出固定的红色return o;}float4 frag(vertOut i):COLOR{return i.color;}ENDCG}//end pass}}7.1.2 ForwardBase和ForwardAdd的表现
我们编译运行一下,根据上面图中所示的结果,在VertexLit渲染模式下, ForwardBase和FowardAdd的LightMode都不被支持。另外,FwdAddX.shader在3个渲染路径下都没有输出,这说明ForwardAdd这个Pass需要和ForwardBase一起使用,否则会被Unity所忽视掉。在Forward和Deferred渲染路径下,Forward的Pass均能被正常渲染。
2 0
- untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd
- untiy 3d ShaderLab_第7章_ Forward渲染路径_3_重要光源在ForwardAdd内的执行
- untiy 3d ShaderLab_第7章_ Forward渲染路径_4_Forward渲染路径总结
- untiy 3d ShaderLab_第7章_ Forward渲染路径_2_Forward渲染路径下的重要光源
- untiy 3d ShaderLab_第8章_3_ 单光贴图和Forward 渲染路径
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_2_3个渲染路径之外
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_1_顶点照明
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_2_顶点照明和Unity存放光源的第一种方式
- untiy 3d ShaderLab_第8章_4_ 单光照贴图在Deferred 渲染路径下的实时阴影
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_3_顶点照明和Unity存放光源的第二种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第6章_VertexLit渲染路径_4_顶点照明和Unity存放光源的第三种方式
- untiy 3d ShaderLab_第4章_基本的光照模型
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_ 基于光照贴图的烘焙照明
- untiy 3d ShaderLab_第8章_2_在效果和性能间进行权衡
- untiy 3d ShaderLab_第5章_第一个被执行的Pass_1_不同LightMode 被选择的顺序
- untiy 3d ShaderLab_第3章_Shader(着色器)中用到的各种空间概念
- Linux死锁调试之softlockup
- Fragment和Activity之间的数据传递(两种:Acitvity-->Fragment;Fragment---->Activity)
- JVM学习总结--体系结构、内存管理和垃圾回收
- ViewHolder模式
- 你的第一个网页
- untiy 3d ShaderLab_第7章_ Forward渲染路径_1_ForwardBase和ForwardAdd
- cmd used in sql tests (sql学习指南)
- 论程序员的自我修养
- MongoDB元素查询操作符
- mac在命令行里获取root权限
- 老式浏览器(IE6,IE7,IE8)识别html5标签
- DB2 只进行单个表空间的恢复
- java循环结构(以及break,continue的使用)
- 笔记:TCP协议可靠性数据传输原理分析