使用2D渐变纹理创建假的BRDF

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

      我们可以在渐变纹理的思路上添加由光照函数提供的视角方向来创建一个高级可视化效果,利用视角方向我们能够生成一些模拟的边缘光照。

      观察方向(view direction)指的是我们看向物体自身的方向。它是一个标注了方向的向量,这意味着我们可以将它和法线以及光照方向结合起来使用。这种视点向量可以为我们提供一种更先进的纹理索引技术。

     在CG领域我们一般将这种技术叫做BRDF effect, BRDF也就是双向反射分布函数。读起来似乎有点拗口,我们可以简单理解为入射光在不透明物体表面同时反射 到观察方向(观察者眼睛方向)和出射光两个方向。

一、首先准备一张多维度的渐变纹理

BRDF.jpg(网上找的)

二、创建Shader


  1. Shader "Custom/BRDFShader" {
  2. Properties {
  3. _RampTex ("Ramp (RGB)", 2D) = "white" {}
  4. }
  5. SubShader {
  6. Tags { "RenderType"="Opaque" }
  7. LOD 200
  8. CGPROGRAM
  9. #pragma surface surf BasicDiffuse
  10.  
  11. sampler2D _RampTex;
  12.  
  13. struct Input {
  14. float2 uv_RampTex;
  15. };
  16. inline float4 LightingBasicDiffuse (SurfaceOutput s, fixed3 lightDir, half3 viewDir, fixed atten)
  17. {
  18. float difLight = dot(s.Normal, lightDir);
  19. float rimLight = dot(s.Normal, viewDir);
  20. float hLambert = difLight*0.5 + 0.5;
  21. float3 ramp = tex2D(_RampTex, float2(hLambert, rimLight)).rgb;
  22. float4 col;
  23. col.rgb = s.Albedo*_LightColor0.rgb*ramp;
  24. col.a = s.Alpha;
  25. return col;
  26. }
  27.  
  28. void surf (Input IN, inout SurfaceOutput o) {
  29. half4 c = tex2D (_RampTex, IN.uv_RampTex);
  30. o.Albedo = c.rgb;
  31. o.Alpha = c.a;
  32. }
  33. ENDCG
  34. }
  35. FallBack "Diffuse"
  36. }


三、创建一个Sphere

2222.png


场景中的效果

111111111.png


当使用观察方向参数时,我们可以创建一个简单的衰减效果。你可以使用这个参数来制作任何不同类型的效果:一个透明的泡泡、边缘高光效果、盾牌效果,甚至可以制作卡通边缘效果。关键是要深入理解我们从点积运算得到的值以及如何制作纹理。在光照函数内部是如何围绕表面来模拟复杂光照效果的。

标签: Shader

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号