Unity3D ShaderLab 静态贴图光照模型.doc_第1页
Unity3D ShaderLab 静态贴图光照模型.doc_第2页
Unity3D ShaderLab 静态贴图光照模型.doc_第3页
Unity3D ShaderLab 静态贴图光照模型.doc_第4页
Unity3D ShaderLab 静态贴图光照模型.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

其实在unity的光照模型中,我们可以把光照讯息烘培进入一个2D贴图,来实现着色器的光照效果。 更多精彩请关注【狗刨学习网】 下面是在unity中关闭灯光和打开灯光的对比效果。所以这类着色器的缺点就是不会随着光源变化效果。 接下来,我们开始创建,首先通过软件MaCrea来制作我们的2D光照贴图,MaCrea软件 通过该软件可以快速制作一个完整的发光球体平面图。 完成静态光照贴图的制作后。在unity中创建Shader,Material。直接打开Shader脚本编辑:1roperties:1. 1 Properties 2. 23. 3 _MainTint(Diffuse Color,Color) = (1,1,1,1)4. 45. 5 _MainTex (Base (RGB), 2D) = white 6. 67. 7 _NormalMap(Normal Map,2D) = 8. 89. 9 复制代码2SubShader:1. 1 CGPROGRAM2. 23. 3 #pragma surface surf Unlit vertex:vert4. 45. 56. 67. 7 float4 _MainTint;8. 89. 9 sampler2D _MainTex;10. 1011. 11 sampler2D _NormalMap;12. 1213. 13 struct Input 14. 1415. 15 float2 uv_MainTex;16. 1617. 17 float2 uv_NormalMap;18. 1819. 19 float3 tan1;20. 2021. 21 float3 tan2;22. 2223. 23 ;复制代码/因为我们要使用单独的球体贴图来实现光照,所以我们无需使用Lambert光照函数,只需要申明自定义无光亮的光照函数;3光照函数1. 1 inline fixed4 LightingUnlit(SurfaceOutput s, fixed3 lightDir, fixed3 atten)2. 23. 3 fixed4 c= fixed4(1,1,1,1);4. 45. 5 c.rgb = c*s.Albedo;6. 67. 7 c.a = s.Alpha;8. 89. 9 return c;10. 1011. 11 复制代码/我们只希望通过外部物体来产生阴影,因为该着色器不受光源的;4计算球面贴图1. 1 void vert(inout appdata_full v, out Input o)2. 23. 3 UNITY_INITIALIZE_OUTPUT(Input, o);4. 45. 56. 67. 7 TANGENT_SPACE_ROTATION ;8. 89. 9 o.tan1 = mul(rotation,UNITY_MATRIX_IT_MV0.xyz);10. 1011. 11 o.tan2 = mul(rotation,UNITY_MATRIX_IT_MV1.xyz);12. 1213. 13 复制代码/为了正确的检索到球面贴图,我们需要把正切旋转矩阵乘以当前模型的逆转模型视图;5完善surf1. 1 void surf (Input IN, inout SurfaceOutput o) 2. 23. 3 float3 normals = UnpackNormal(tex2D(_NormalMap,IN.uv_NormalMap);4. 45. 5 o.Normal = normals;6. 67. 78. 89. 9 float2 litSphereUV;10. 1011. 11 litSphereUV.x = dot(IN.tan1,o.Normal);12. 1213. 13 litSphereUV.y = dot(IN.tan2,o.Normal);14. 1415. 1516. 1617. 17 half4 c = tex2D (_MainTex, litSphereUV*0.5+0.5);18. 1819. 19 o.Albedo = c.rgb*_MainTint;20. 2021. 21 o.Alpha = c.a;22. 2223. 23 复制代码 通过以上的步骤,我们完成这个静态的光照模型。返回unity中简单设置后,就可以看出效果了。 在上面的过程中,最主要的是vert函数,因为在这个函数里,我们把旋转切向量和逆转模型视图矩阵相乘,在赋值给o.tan1和o.tan2。 这个计算就是把向量弯曲到何时的位置来检索球面的贴图。而逆转模型视图则是我们利用unity内置的值。 通过上面的检索传递后,我们简单的将IN.tan1和IN.tan2的值作为球面贴图纹理检索的uv值, 我们可以直接使用input结构体中的值,因为我们也在vert函数中将这些值传递进去了。1. 1 Shader 91YGame/LightStatic 2. 2 Properties 3. 3 _MainTint(Diffuse Color,Color) = (1,1,1,1)4. 4 _MainTex (Base (RGB), 2D) = white 5. 5 _NormalMap(Normal Map,2D) = 6. 6 7. 7 SubShader 8. 8 Tags RenderType=Opaque 9. 9 LOD 20010. 10 11. 11 CGPROGRAM12. 12 #pragma surface surf Unlit vertex:vert13. 1314. 14 float4 _MainTint;15. 15 sampler2D _MainTex;16. 16 sampler2D _NormalMap;17. 1718. 18 struct Input 19. 19 float2 uv_MainTex;20. 20 float2 uv_NormalMap;21. 21 float3 tan1;22. 22 float3 tan2;23. 23 ;24. 2425. 2526. 2627. 27 inline fixed4 LightingUnlit(SurfaceOutput s, fixed3 lightDir, fixed3 atten)28. 28 fixed4 c= fixed4(1,1,1,1);29. 29 c.rgb = c*s.Albedo;30. 30 c.a = s.Alpha;31. 31 return c;32. 32 33. 3334. 34 void vert(inout appdata_full v, out Input o)35. 35 UNITY_INITIALIZE_OUTPUT(Input, o);36. 3637. 37 TANGENT_SPACE_ROTATION;38. 38 o.tan1 = mul(rotation,UNITY_MATRIX_IT_MV0.xyz);39. 39 o.tan2 = mul(rotation,UNITY_MATRIX_IT_MV1.xyz);40. 40 41. 4142. 42 void surf (Input IN, inout SurfaceOutput o) 43. 43 float3 normals = UnpackNormal(tex2D(_NormalMap,IN.uv_NormalMap);44. 44 o.Normal = normals;45. 4546. 46 float2 litSphereUV;47. 47 litSphereUV.x = dot(IN.tan1,o.Normal);48. 48 litSphereUV.y = dot(IN.tan2,o.Normal);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论