码迷,mamicode.com
首页 > 其他好文 > 详细

Unity的shader学习2

时间:2014-08-10 01:36:59      阅读:321      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   使用   os   io   for   

下面继续看基于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定义的自发光亮度常量。

Unity的shader学习2,布布扣,bubuko.com

Unity的shader学习2

标签:style   blog   http   color   使用   os   io   for   

原文地址:http://www.cnblogs.com/rayking/p/3901759.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!