文档章节

#学习笔记#Unity3d shader 不同的LightMode被的选择的顺序

刘不羞同学
 刘不羞同学
发布于 2015/08/19 17:37
字数 910
阅读 2969
收藏 2

Unity支持3种RenderingPath(绘制路径),分别是VertexLit,ForWard和DeferredLighting。

path1

这是一个被设计只为在Camera的RenderingPath为Deferred(延迟)模式下输出红色的shader。

Deferred.shader

Shader "Custom/deferred"{
 Properties{
   _MainTex("Base(RGB)",2D) = "white"{}
   }
   
 Subshader{
   //Opaque(不透明): 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
   Tags{"RenderType" = "Opaque"}//通过使用tags来告诉渲染引擎在什么时候该如何渲染他们所期望的效果。
   
   //贴图和背景叠加,无Alpha透明通道处理。仅仅是颜色rgb数值的叠加更趋近于白色即(1,1,1)
   Blend One One
   
   CGPROGRAM
   #pragma surface surf MyDeferred //声明surface shader的函数
                                   //http://blog.csdn.net/candycat1992/article/details/39994049
                                   
   //half:中精度浮点值。通常是16位,范围是-60000至+60000,它适合存储UV坐标,颜色值       
   //自定义光照类型:half4 LightingName_PrePass (SurfaceOutput s, half4 light); 如果需要光照延时(deferred)不写则全部采用快速光照(forward)。
    half4 LightingMyDeferred_PrrePass (SurfaceOutput s,half4 light){
  
  /*
  struct SurfaceOutput {
    half3 Albedo;
    half3 Normal;
    half3 Emission;
    half Specular;
    half Gloss;
    half Alpha;
};
  */
   
   half4 c;
   c.rgb = s.Albedo;     //漫反射的颜色值
   c.a = s.Alpha;
   return c;
   }
   
   struct Input{
   float2 uv_MainTex;
   };
   
   sampler2D _MainTex;
   void surf(Input IN,inout SurfaceOutput o){//第一个参数,纯输入上述结构体参数,inout,意思是为输入参数也可输出参数
   o.Albedo = float3(1,0,0);
   }
   ENDCG
   }
 }

  path2.

这是一个包换可以适应Deferred以及Forward渲染路径的材质,其中适应Deferred的部分输出(1,0,0,1)的红色,而适应Forward的部分只会输出(0,1,0,1)的绿色。两个部分都是用了Blend One One混合模式,也就是说如果两部部分都 执行,应该会输出(1,1,0,1)的黄色,反之只会输出被执行的哪一个输出颜色,也就是红色或者绿色。

shader "Deferred_Forward"

  SubShader{
     Blend One One
     
     Pass{
       Tags{"LightMode" = "ForwardBase"}//用于正向渲染,环境主要方向灯和定点光/SH 等的应用 ,第一个像素光所在的反射通道标记为Forward
       //贴图和背景叠加,无Alpha透明通道处理。仅仅是颜色rgb数值的叠加更趋近于白色即(1,1,1)
       Blend One One
       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);//model“View”Projection
       o.color = float4(0,1,0,1);
       return o;
     }
       float4 frag(verOut i):COLOR
     {
       return i.color;
     }
     ENDCG
     }
     
     CGPROGRAM
     #pragma surface surf MyDeferred
     half4 LightingMyDeferred_PrePass(SurfaceOutput s , half4 light){
        half c;
        c.rgb = s.Albedo;
        c.a = s.Alpha;
        return c;
        }
        struct Input{
        float2 uv_MainTex;
        };
        sample2D _MainTex;
        void surf (Input IN,inout SurfaceOutput o){
        o.Albedo = float3(1,0,0);
        }
        ENDCG
        }
      }


path3.

这个shader添加了可以适应VertexLit渲染路径的Pass,会输出蓝色。也就是说,如果三个都执行,则会输出(1,1,1,1),否则会输出红蓝绿3个颜色的一个或者两个的组合。

shader "Deferred_Forward_Vertex"{

    SubShader{
    Blend One One
    //.1
    Pass{
    Tag{"LightMode" = "Vertex"}//用于顶点光照渲染,当物体没有光照映射时,所有顶点光照被应用
    Blend One Zero
    
    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(0,0,1,1);
      return o;
      }
      float4 frag(vertOut i):COLOR
      {
      return i.color;
      }
      ENDCG
      }
      
      //.2
      Pass{
      Tags{"LightMode" = "ForwardBase"}
      Blend One One
      
      CGPROGRAM
      #pragram vertex vert
      #pragram 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,1,0,1);
       return o;
      }
      
      float4 frag(vertOut i):COLOR
      {
      return i.color;
      }
      ENDCG
      }
      
      //.3
      CGPROGRAM
      #pragram surface surf MyDeferred
      half4 LightingMyDeferred_PrePass(SurfaceOutput s,half4 light){
      half4 c;
      c.rgb = s.Albedo;
      c.a = s.Alpha;
      return c;
      }
      
      struct Input{
      float2 uv_MainTex;
      };
      sampler2D _MainTex;
      void surf (Input IN, inout SurfaceOutput o){
      o.Albedo = float3(1,0,0);
      }
      ENDCG
      }
    }


























© 著作权归作者所有

刘不羞同学
粉丝 0
博文 2
码字总数 910
作品 0
杭州
程序员
私信 提问
【厚积薄发】帧同步框架下的浮点数精度计算

版权声明:本文所有文章均为原创,原文链接:blog.uwa4d.com,如需转载请联系support@uwa4d.com https://blog.csdn.net/UWA4D/article/details/82425839 这是第127篇UWA技术知识分享的推送。...

UWA
2018/09/05
0
0
【《Unity Shader入门精要》 提炼总结】(十五)第十五章·光照系统进阶教程&Unity的渲染路径介绍&前向渲染路径&顶点照明渲染路径&延迟渲染路径

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/84887592 本文由@唐三十胖子出品,转载请注明出处。 文章链接:https://blog.csdn.n...

唐三十胖子
2018/12/07
0
0
Unity3D 单片草顶点摆动

Shader "MobileShadow/Grass" { Properties { MainTex ("MainTex", 2D) = "white" {} AlphaR ("AlphaR", 2D) = "white" {} Settings ("Settings", Vector) = (1.5,0.1,0.5,0) } SubShader { ......

yuyingwin
2018/05/09
0
0
Unity-Shader(二)漫反射光照模型

先来看一下基本光照模型中的漫反射部分的计算公式。 逐顶点光照实现 在Pass 中指明 光照模式 LightMode标签支持的渲染路径设置选项 我们这里主要是来看一下 如何实现逐顶点的漫反射光照,看一...

带头小哥哥
2018/08/31
0
0
【Unity Shader学习笔记】(三) ---------------- 光照模型原理及漫反射和高光反射的实现

本文主要参考了冯乐乐老师的《Unity Shader入门精要 》一书,再加上网上一些参考资料而写。 笔者使用的是 Unity 2018.2.0f2 + VS2017,书中使用的是 Unity 5.2.1 ,由于版本更新,所以本文的...

爱喝柠檬的二哈
2018/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部