zoukankan      html  css  js  c++  java
  • Unity的shader学习2

    下面继续看基于surface的shader代码,基本与Vertex&Fragment shader差不多,只是不能写pass,然后只需要声明surface函数,就能处理所有的事情。

     1 Shader "T1/Hero/Diffuse" {
     2     Properties {
     3         _MainTex ("Base (RGB)", 2D) = "white" {}
     4         _Color ("Main Color", Color) = (1,1,1,1)
     5         [HideInInspector]_BlendColor("_Blend Color", Color) = (1, 1, 1, 0)
     6         [HideInInspector]_BlendIntensity ("BlendColorShininess", Range (1, 4)) = 1
     7     }
     8     SubShader {
     9         Tags { "Queue" = "Geometry+20" "RenderType"="Opaque"}
    10         LOD 200
    11 
    12         CGPROGRAM
    13        // #include "T1.cginc"
    14         #pragma surface surf LambertT1HeroSideLight   
    15         #pragma only_renderers d3d9 opengl 
    16 
    17         sampler2D _MainTex;
    18         fixed4 _Color;
    19 
    20         struct Input {
    21             float2 uv_MainTex;
    22         };
    23 
    24         #include "T1.cginc"
    25 
    26         void surf (Input IN, inout SurfaceOutput o) {
    27             half4 c = tex2D (_MainTex, IN.uv_MainTex) ;
    28             #if defined (UNITY_PASS_FORWARDBASE) || defined (UNITY_PASS_PREPASSFINAL)
    29                 o.Albedo =  lerp (c.rgb* _Color.rgb, _BlendColor * _BlendIntensity,  _BlendColor.a);
    30             #else
    31                 o.Albedo =  c.rgb* _Color.rgb;
    32             #endif
    33             o.Alpha = 0; 
    34             o.Emission = c.rgb * _heroSelfIllumin;
    35         }
    36         ENDCG
    37     } 
    38     FallBack "Hidden/T1/VertexLit-Hero"
    39 }

     第3行的_MainTex声明后,就可以在第17行中引用到。

     第5-6行的HideInInspector意思是不在编辑器的属性界面显示,隐藏起来。然后_BlendColor表示一个颜色,_BlendIntensity表示0-1的值。看后面的意思可以得知是混合颜色和混合强度。

     第9行的RenderType=Opaque表示声明是一个不透明的物体,具体解释在这里,然后"Queue" = "Geometry+20"其实就是说渲染层次是2000+20,就是比一般的不透明物体层次要高一点。

     第10行的LOD这个数值决定了我们能用什么样的 Shader。在Unity的Quality Settings中我们可以设定允许的最大LOD,当设定的LOD小于SubShader所指定的LOD时,这个SubShader将不可用。Unity 内建Shader定义了一组LOD的数值。具体解释在这里。200是默认的diffuse值。

     第14行的#pragma surface surf Lambert,它声明了我们要写一个表面Shader,并指定了光照模型。它的写法是这样的

      #pragma surface surfaceFunction lightModel [optionalparams]

    • surface - 声明的是一个表面着色器
    • surfaceFunction - 着色器代码的方法的名字
    • lightModel - 使用的光照模型。

     Lambert就是普通的diffuse漫反射光照模型。

     第15行#pragma only_renderers d3d9 opengl表示限制这个shader只编译在d3d9和opengl上。具体解释在这里

     第17行sampler2D就是GLSL中的2D贴图的类型,相应的,还有sampler1D,sampler3d,samplerCube等等格式。不啰嗦了

     第18行的fixed4主要用来表示颜色rgba四个数值。

     第20行的Input声明后,主要是用来给surf函数来使用的。

     第26行-34行主要是CG规定了声明为表面着色器的方法(就是我们这里的surf)的参数类型和名字,因此我们没有权利决定surf的输入输出参数的类型,只能按 照规定写。这个规定就是第一个参数是一个Input结构,第二个参数是一个inout的SurfaceOutput结构。

     这里用到了一个tex2d函数,这是CG程序中用来在一张贴图中对一个点进行采样的方法,返回一个float4。这里对_MainTex在输入点上进行了采 样,并将其颜色的rbg值赋予了输出的像素颜色。

     28行的主要意思见这里。这里主要是前向渲染或者延迟渲染的话,物体颜色就需要考虑混合的颜色和混合的亮度,否则就直接取颜色。

     33行,设置无透明。

     34行表示自发光,这个值是图片的颜色乘以t1定义的自发光亮度常量。

  • 相关阅读:
    正则表达式
    简单的js拖动
    asp.net网站安全常见问题与防范
    Jquery操作select、checkbox、radio详细讲解
    利用ListView自定义高效分页
    文件上传
    Sql 分区问题
    封装读取配置文件类
    TypeConverter学习
    构造AJAX参数, 表单元素JSON相互转换
  • 原文地址:https://www.cnblogs.com/rayking/p/3901759.html
Copyright © 2011-2022 走看看