ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:19.16KB ,
资源ID:10209246      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10209246.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Unity双面渲染shader.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Unity双面渲染shader.docx

1、Unity双面渲染shader双面渲染shaderUnity内置的Shader,都是单面效果,想必导入Mesh的同学都碰到过这样的痛苦,布料飘起的背面部分看起来是空气,汽车透过车窗看到是路面.各种蛋疼。有些文章教导大家 把模型做出厚度来吧,这种做法实在太那个啥了.其实用改写Shader的方法可以很方便的实现双面材质。Unity里有3种Shader方式:1.Fixed Function Shaders2.Vertex and Fragment Shaders3. Surface Shaders关于这部分的详细介绍,请参考官方的教程。这三种方式里,都可以通过直接在Shader代码头部添加一个Cul

2、l off 语句,实现强制双面渲染。但是直接用Cull off的方式 有个重大的缺陷,这材质从两面看无论贴图、颜色、反光、照明情况,都是一模一样的,这并不符合大多数实际情况的常识。在第1和第2种Shader里,是可以通过在一个渲染子程序里用两个渲染Pass来实现双面不同效果的,这部分网上的资料也很多,写起来也很简单直接。这里主要讨论的是第三种也是最常用的Surface Shader的双面不同效果的实现。Surface Shader是不能写在Pass里的,所以要实现它的双面不同效果就要用其他变通的办法。首先去Unity官方网站下载一个内置Shader的代码包,链接如下:打开后看见一堆.shade

3、r文件,可以用任何文本编辑器打开。可以看见系统内建的Shader基本都是Surface方式。这里随便打开一个Normal-BumpSpec.Shader 这是普通的高光-凹凸贴图材质复制代码1.Shader Bumped Specular 2.Properties 3. _Color (Main Color, Color) = (1,1,1,1)4. _SpecColor (Specular Color, Color) = (0.5, 0.5, 0.5, 1)5. _Shininess (Shininess, Range (0.03, 1) = 0.0781256. _MainTex (Bas

4、e (RGB) Gloss (A), 2D) = white 7. _BumpMap (Normalmap, 2D) = bump 8.9.SubShader 10. Tags RenderType=Opaque 11. LOD 40012. 13.CGPROGRAM14.#pragma surface surf BlinnPhong15.16.17.sampler2D _MainTex;18.sampler2D _BumpMap;19.fixed4 _Color;20.half _Shininess;21.22.struct Input 23. float2 uv_MainTex;24. f

5、loat2 uv_BumpMap;25.;26.27.void surf (Input IN, inout SurfaceOutput o) 28. fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);29. o.Albedo = tex.rgb * _Color.rgb;30. o.Gloss = tex.a;31. o.Alpha = tex.a * _Color.a;32. o.Specular = _Shininess;33. o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap);34.35.E

6、NDCG36.37.FallBack Specular38.简单解说一下几个关键行:第一行Shader Bumped Specular 指定了这个shader出现在Unity系统Shader菜单里的名字,如果要修改系统内建Shader的源代码,最好把这个名字改掉,否则和系统内建Shader重名啦。我是这样写的: Shader Hogs shaders/BumpSpec_Twoside ,这个shader会出现在Hogs shaders组里,系统会自动完成这个加载。第二行Properties后面的一组以下划线开头的变量表示了这个渲染器需要设置的参数。对于一个高光-凹凸材质来说,需要材质颜色、反光

7、颜色、反光率、材质贴图和法线贴图,这5个变量就对应这5个东西啦,详细请参考系统手册。在第11行LOD 400 后面加上一行:Cull off,这个材质就会自动双面渲染了 Cull off表示双面都渲染,不写默认是Cull back,不渲染背面。你也可以写上Cull front,不渲染正面。改完这行 ,把第一行改成你希望的名字,把这个shader文件拷贝到工程的assets目录底下,系统就能自动加载啦。效果如图:双面是双面了,但是哪有两面是一样亮、一样高光区域的.,全透光的砖墙,这种双面很少会用到吧。如何做到双面不同效果呢?前面说了Surface shader是不能写两个pass渲染不同面的,但

8、其实surface方式可以写多个渲染过程,根本不需要pass的概念,Surface Shader可以这样写:Call back渲染正面的代码Call front渲染反面的代码就可以实现双面不同的控制了。根据这个原理,其实我们只要把系统内建shader的源代码复制一份,就能实现另一面不同效果了。以下供参考:复制代码1.Shader Hogs shaders/BumpSpec_Twoside 2.Properties 3./正面5个参数4. _Color (Main Color, Color) = (1,1,1,1)5. _SpecColor (Specular Color, Color) = (

9、0.5, 0.5, 0.5, 1)6. _Shininess (Shininess, Range (0.03, 1) = 0.0781257. _MainTex (Base (RGB) Gloss (A), 2D) = white 8. _BumpMap (Normalmap, 2D) = bump 9./反面拷贝 改名 也是5个10. _BackColor (Back Main Color, Color) = (1,1,1,1)11. _BackSpecColor (Back Specular Color, Color) = (0.5, 0.5, 0.5, 1)12. _BackShinin

10、ess (Back Shininess, Range (0.03, 1) = 0.07812513. _BackMainTex (Back Base (RGB) Gloss (A), 2D) = white 14. _BackBumpMap (Back Normalmap, 2D) = bump 15.16.SubShader 17.Tags RenderType=Opaque 18. LOD 40019. Cull back20./开始渲染正面 21.CGPROGRAM22./表明是surface渲染方式 主渲染程序是surf 光照模型是BLinnPhong23.#pragma surfac

11、e surf BlinnPhong 24.25.26.sampler2D _MainTex;27.sampler2D _BumpMap;28.fixed4 _Color;29.half _Shininess;30.31.struct Input 32. float2 uv_MainTex;33. float2 uv_BumpMap;34.;35.36.void surf (Input IN, inout SurfaceOutput o) 37. fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);38. o.Albedo = tex.rgb * _Color

12、.rgb;39. o.Gloss = tex.a;40. o.Alpha = tex.a * _Color.a;41. o.Specular = _Shininess;42. o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap);43.ENDCG44.45.46. Cull front47./开始渲染反面 其实和就是拷贝了一份正面渲染的代码 除了变量名要改 48.CGPROGRAM49.#pragma surface surf BlinnPhong50.51.sampler2D _BackMainTex;52.sampler2D _Bac

13、kBumpMap;53.fixed4 _BackColor;54.half _BackShininess;55.56.struct Input 57. float2 uv_BackMainTex;58. float2 uv_BackBumpMap;59.;60.61.void surf (Input IN, inout SurfaceOutput o) 62. fixed4 tex = tex2D(_BackMainTex, IN.uv_BackMainTex);63. o.Albedo = tex.rgb * _BackColor.rgb;64. o.Gloss = tex.a;65. o.

14、Alpha = tex.a * _BackColor.a;66. o.Specular = _BackShininess;67. o.Normal = UnpackNormal(tex2D(_BackBumpMap, IN.uv_BackBumpMap);68.ENDCG69.70.FallBack Specular71.这是个双面可以分别指定的高光-凹凸材质,注意几个要点:properties部分只能出现一次,所以这是不能直接拷贝的。因为要为双面指定不同的参数,双面的参数变量名肯定不能一样,这个论坛里都是程序猿,没必要多解释了。我简单的把用于正面的5个参数前面都加上了一个Back用于反面。在

15、CG代码内部也要对应的应用相应的参数,反面的渲染代码就用刚才全部加了Back的那5个参数。正面代码段用Cull back 开始 反面的代码用Cull front开始以下是渲染效果:一面是砖墙一面是木板。蛋疼了没这个模式下,双面也完全可以指定不同的材质,基本上你不用学习很多内建Shader和CG语法,通过简单的copy-paste就能组合出无穷的双面材质来了。再提升一下,其实我们常用的双面效果,除了透明的材质以外,无非是两种:一是反面和正面同样纹理,但是不需要高光、反射,只需要一个相对黯淡的被环境光照亮的材质,比如砖墙木盒衣服什么的二是反面显示为单身或其他纹理,但也不需要高光、反射,只需要被环境

16、光照亮,比如汽车内部 建筑物内部等等。第一种情况,反面可以沿用正面纹理,但是以普通的Diffuse方式着色第二种情况,反面不指定或者单独指定纹理,也以普通的Diffuse方式着色两种情况,反面的渲染都可以借用系统内建Shader的Diffuse渲染代码来实现,方式一的代码:复制代码1.Shader Hogs shaders/BumpSpec_Twoside1 2.Properties 3. _Color (Main Color, Color) = (1,1,1,1)4. _SpecColor (Specular Color, Color) = (0.5, 0.5, 0.5, 1)5. _Shi

17、niness (Shininess, Range (0.03, 1) = 0.0781256. _MainTex (Base (RGB) Gloss (A), 2D) = white 7. _BumpMap (Normalmap, 2D) = bump 8. _BackColor (Back Main Color, Color) = (1,1,1,1)9.10.SubShader 11. Tags RenderType=Opaque 12. LOD 40013. Cull back14. 15.CGPROGRAM16.#pragma surface surf BlinnPhong17.18.1

18、9.sampler2D _MainTex;20.sampler2D _BumpMap;21.fixed4 _Color;22.half _Shininess;23.24.struct Input 25. float2 uv_MainTex;26. float2 uv_BumpMap;27.;28.29.void surf (Input IN, inout SurfaceOutput o) 30. fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);31. o.Albedo = tex.rgb * _Color.rgb;32. o.Gloss = tex.a;

19、33. o.Alpha = tex.a * _Color.a;34. o.Specular = _Shininess;35. o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap);36.ENDCG37.38. Cull front39. 40.CGPROGRAM41.#pragma surface surf Lambert42.43.sampler2D _MainTex;44.fixed4 _BackColor;45.46.struct Input 47. float2 uv_MainTex;48.;49.50.void surf (In

20、put IN, inout SurfaceOutput o) 51. fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _BackColor;52. o.Albedo = c.rgb;53. o.Alpha = c.a;54.55.ENDCG56.57.FallBack Specular58.反面渲染的运算就直接借用了系统的Diffuse Shader,只不过纹理是沿用正面的纹理,只增加了一个反面的颜色变量用来模拟环境光亮度,与纹理混合实现反面效果。渲染效果如下:方式二代码:复制代码1.Shader Hogs shaders/BumpSpec_Twosid

21、e2 2.Properties 3. _Color (Main Color, Color) = (1,1,1,1)4. _SpecColor (Specular Color, Color) = (0.5, 0.5, 0.5, 1)5. _Shininess (Shininess, Range (0.03, 1) = 0.0781256. _MainTex (Base (RGB) Gloss (A), 2D) = white 7. _BumpMap (Normalmap, 2D) = bump 8. _BackColor (Back Main Color, Color) = (1,1,1,1)9

22、. _BackMainTex (Back Base (RGB) Gloss (A), 2D) = white 10.11.SubShader 12. Tags RenderType=Opaque 13. LOD 40014. Cull back15. 16.CGPROGRAM17.#pragma surface surf BlinnPhong18.19.20.sampler2D _MainTex;21.sampler2D _BumpMap;22.fixed4 _Color;23.half _Shininess;24.25.struct Input 26. float2 uv_MainTex;2

23、7. float2 uv_BumpMap;28.;29.30.void surf (Input IN, inout SurfaceOutput o) 31. fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);32. o.Albedo = tex.rgb * _Color.rgb;33. o.Gloss = tex.a;34. o.Alpha = tex.a * _Color.a;35. o.Specular = _Shininess;36. o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap);37.

24、ENDCG38.39. Cull front40. 41.CGPROGRAM42.#pragma surface surf Lambert43.44.sampler2D _BackMainTex;45.fixed4 _BackColor;46.47.struct Input 48. float2 uv_BackMainTex;49.;50.51.void surf (Input IN, inout SurfaceOutput o) 52. fixed4 c = tex2D(_BackMainTex, IN.uv_BackMainTex) * _BackColor;53. o.Albedo = c.rgb;54. o.Alpha = c.a;55.56.ENDCG57.58.FallBack Specular59.此方式下反面可以单独指定纹理,不指定就直接显示指定的反面颜色,渲染效果如下以上只是介绍一个基本思想,在这个基础上能应该能衍生出无穷的变化。对自定义shader有兴趣的可以参考系统手册和Nvidia的CG教学手册。不过千万不要动不动就使用双面材质,因为会增加系统负荷,应该只用在需要的地方。把以上代码起个名字另存为.shader文件,导入工程assets,就能直接使用。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1