使用#define指令模块化地创建着色器

作者:追风剑情 发布于:2016-3-6 13:38 分类:Shader

一、创建MyCgInclude.cginc文件

  1. #ifndef MY_CG_INCLUDE
  2. #define MY_CG_INCLUDE
  3.  
  4. fixed4 _MyColor;
  5.  
  6. //半兰伯特光照模型
  7. inline fixed4 LightingHalfLambert (SurfaceOutput s, fixed3 lightDir, fixed atten)
  8. {
  9. fixed diff = max (0, dot(s.Normal, lightDir));
  10. //如果定义了HalfLambert宏,则采用半兰伯特光照模型,否则采用普通的NdotL漫反射模型。
  11. #ifdef HalfLambert
  12. diff = (diff + 0.5)*0.5;
  13. #endif
  14. fixed4 c;
  15. c.rgb = s.Albedo*_LightColor0.rgb*((diff*_MyColor.rgb)*atten*2);
  16. c.a = s.Alpha;
  17. return c;
  18. }
  19.  
  20. #endif

二、创建着色器

  1. Shader "Custom/HalfLambertShader" {
  2. Properties {
  3. _MainTex ("Base (RGB)", 2D) = "white" {}
  4. _DesatValue ("Desaturate", Range(0, 1)) = 0.5
  5. _MyColor ("My Color", Color) = (1,1,1,1)
  6. }
  7. SubShader {
  8. Tags { "RenderType"="Opaque" }
  9. LOD 200
  10. CGPROGRAM
  11. //定义HalfLambert宏,以便启用半兰伯特光照模型。
  12. #define HalfLambert
  13. #include "MyCgInclude.cginc"
  14. #pragma surface surf HalfLambert
  15.  
  16. sampler2D _MainTex;
  17.  
  18. struct Input {
  19. float2 uv_MainTex;
  20. };
  21.  
  22. void surf (Input IN, inout SurfaceOutput o) {
  23. half4 c = tex2D (_MainTex, IN.uv_MainTex);
  24. o.Albedo = c.rgb;
  25. o.Alpha = c.a;
  26. }
  27. ENDCG
  28. }
  29. FallBack "Diffuse"
  30. }

使用半兰伯特光照模型的效果

b111.png

使用NdotL漫反射模型效果

n1111.png

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号