为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

Unity双面渲染shader

2022-12-23 7页 doc 26KB 19阅读

用户头像 个人认证

天涯明月

暂无简介

举报
Unity双面渲染shader双面渲染shaderUnity内置的Shader,都是单面效果,想必导入Mesh的同学都碰到过这样的痛苦,布料飘起的背面部分看起来是空气,汽车透过车窗看到是路面...各种蛋疼。有些文章教导大家把模型做出厚度来吧,这种做法实在太那个啥了其实用改写Shader的方法可以很方便的实现双面材质。Unity里有3种Shader方式:FixedFunctionShadersVertexandFragmentShadersSurfaceShaders关于这部分的详细介绍,请参考官方的教程。这三种方式里,都可以通过直接在Shader代码头部添...
Unity双面渲染shader
双面渲染shaderUnity内置的Shader,都是单面效果,想必导入Mesh的同学都碰到过这样的痛苦,布料飘起的背面部分看起来是空气,汽车透过车窗看到是路面...各种蛋疼。有些文章教导大家把模型做出厚度来吧,这种做法实在太那个啥了其实用改写Shader的方法可以很方便的实现双面材质。Unity里有3种Shader方式:FixedFunctionShadersVertexandFragmentShadersSurfaceShaders关于这部分的详细介绍,请参考官方的教程。这三种方式里,都可以通过直接在Shader代码头部添加一个Culloff语句,实现强制双面渲染。但是直接用Culloff的方式有个重大的缺陷,这材质从两面看无论贴图、颜色、反光、照明情况,都是一模一样的,这并不符合大多数实际情况的常识。在第1和第2种Shader里,是可以通过在一个渲染子程序里用两个渲染Pass来实现双面不同效果的,这部分网上的资料也很多,写起来也很简单直接。这里主要讨论的是第三种也是最常用的SurfaceShader的双面不同效果的实现。SurfaceShader是不能写在Pass里的,所以要实现它的双面不同效果就要用其他变通的办法。首先去Unity官方网站下载一个内置Shader的代码包,链接如下:HYPERLINK"http://unity3d.com/download_unity/builtin_shaders.zip"http://unity3d.com/download_unity/builtin_shaders.zip打开后看见一堆.shader文件,可以用任何文本编辑器打开。可以看见系统内建的Shader基本都是Surface方式。这里随便打开一个Normal-BumpSpec.Shader这是普通的高光-凹凸贴图材质复制代码1.Shader"BumpedSpecular"{Properties{_Color("MainColor",Color)=(1,1,1,1)_SpecColor("SpecularColor",Color)=(0.5,0.5,0.5,1)_Shininess("Shininess",Range(0.03,1))=0.078125_MainTex("Base(RGB)Gloss(A)",2D)="white"{}_BumpMap("Normalmap",2D)="bump"{}}9.SubShader{Tags{"RenderType"="Opaque"}LOD40012.13.CGPROGRAM14.#pragmasurfacesurfBlinnPhong15.16.sampler2D_MainTex;sampler2D_BumpMap;fixed4_Color;half_Shininess;21.structInput{float2uv_MainTex;float2uv_BumpMap;};26.voidsurf(InputIN,inoutSurfaceOutputo){fixed4tex=tex2D(_MainTex,IN.uv_MainTex);o.Albedo=tex.rgb*_Color.rgb;o.Gloss=tex.a;o.Alpha=tex.a*_Color.a;o.Specular=_Shininess;o.Normal=UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));}ENDCG}FallBack"Specular"}简单解说一下几个关键行:第一行Shader"BumpedSpecular"指定了这个shader出现在Unity系统Shader菜单里的名字,如果要修改系统内建Shader的源代码,最好把这个名字改掉,否则和系统内建Shader重名啦。我是这样写的:Shader"Hog'sshaders/BumpSpec_Twoside",这个shader会出现在Hog'sshaders组里,系统会自动完成这个加载。第二行Properties后面的一组以下划线开头的变量示了这个渲染器需要设置的参数。对于一个高光-凹凸材质来说,需要材质颜色、反光颜色、反光率、材质贴图和法线贴图,这5个变量就对应这5个东西啦,详细请参考系统手册。在第11行LOD400后面加上一行:Culloff,这个材质就会自动双面渲染了Culloff表示双面都渲染,不写默认是Cullback,不渲染背面。你也可以写上Cullfront,不渲染正面。改完这行,把第一行改成你希望的名字,把这个shader文件拷贝到工程的assets目录底下,系统就能自动加载啦。效果如图:双面是双面了,但是哪有两面是一样亮、一样高光区域的,全透光的砖墙,这种双面很少会用到吧。如何做到双面不同效果呢?前面说了Surfaceshader是不能写两个pass渲染不同面的,但其实surface方式可以写多个渲染过程,根本不需要pass的概念,SurfaceShader可以这样写:Callback渲染正面的代码Callfront渲染反面的代码就可以实现双面不同的控制了。根据这个原理,其实我们只要把系统内建shader的源代码复制一份,就能实现另一面不同效果了。以下供参考:复制代码1.Shader"Hog'sshaders/BumpSpec_Twoside"{Properties{//正面5个参数_Color("MainColor",Color)=(1,1,1,1)_SpecColor("SpecularColor",Color)=(0.5,0.5,0.5,1)_Shininess("Shininess",Range(0.03,1))=0.07812530.30._MainTex("Base(RGB)Gloss(A)",2D)="white"{}_BumpMap("Normalmap",2D)="bump"{}9.//反面拷贝改名也是5个_BackColor("BackMainColor",Color)=(1,1,1,1)_BackSpecColor("BackSpecularColor",Color)=(0.5,0.5,0.5,1)_BackShininess("BackShininess",Range(0.03,1))=0.078125_BackMainTex("BackBase(RGB)Gloss(A)",2D)="white"{}_BackBumpMap("BackNormalmap",2D)="bump"{}}16.SubShader{Tags{"RenderType"="Opaque"}LOD400Cullback20.//开始渲染正面CGPROGRAM22.//表明是surface渲染方式主渲染程序是surf光照模型是BLinnPhong#pragmasurfacesurfBlinnPhong24.25.sampler2D_MainTex;sampler2D_BumpMap;fixed4_Color;half_Shininess;structInput{float2uv_MainTex;float2uv_BumpMap;};35.voidsurf(InputIN,inoutSurfaceOutputo){fixed4tex=tex2D(_MainTex,IN.uv_MainTex);o.Albedo=tex.rgb*_Color.rgb;o.Gloss=tex.a;o.Alpha=tex.a*_Color.a;o.Specular=_Shininess;o.Normal=UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));}ENDCG44.45.Cullfront//开始渲染反面其实和就是拷贝了一份正面渲染的代码除了变量名要改CGPROGRAM#pragmasurfacesurfBlinnPhong50.sampler2D_BackMainTex;sampler2D_BackBumpMap;fixed4_BackColor;half_BackShininess;55.structInput{float2uv_BackMainTex;float2uv_BackBumpMap;};60.voidsurf(InputIN,inoutSurfaceOutputo){fixed4tex=tex2D(_BackMainTex,IN.uv_BackMainTex);o.Albedo=tex.rgb*_BackColor.rgb;o.Gloss=tex.a;o.Alpha=tex.a*_BackColor.a;o.Specular=_BackShininess;o.Normal=UnpackNormal(tex2D(_BackBumpMap,IN.uv_BackBumpMap));}ENDCG}FallBack"Specular"}这是个双面可以分别指定的高光-凹凸材质,注意几个要点:properties部分只能出现一次,所以这是不能直接拷贝的。因为要为双面指定不同的参数,双面的参数变量名肯定不能一样,这个论坛里都是程序猿,没必要多解释了。我简单的把用于正面的5个参数前面都加上了一个Back用于反面。在CG代码内部也要对应的应用相应的参数,反面的渲染代码就用刚才全部加了Back的那5个参数。正面代码段用Cullback开始反面的代码用Cullfront开始以下是渲染效果:一面是砖墙一面是木板。。蛋疼了没这个模式下,双面也完全可以指定不同的材质,基本上你不用学习很多内建Shader和CG语法,通过简单的copy-paste就能组合出无穷的双面材质来了。再提升一下,其实我们常用的双面效果,除了透明的材质以外,无非是两种:一是反面和正面同样纹理,但是不需要高光、反射,只需要一个相对黯淡的被环境光照亮的材质,比如砖墙木盒衣服什么的二是反面显示为单身或其他纹理,但也不需要高光、反射,只需要被环境光照亮,比如汽车内部建筑物内部等等。第一种情况,反面可以沿用正面纹理,但是以普通的Diffuse方式着色第二种情况,反面不指定或者单独指定纹理,也以普通的Diffuse方式着色两种情况,反面的渲染都可以借用系统内建Shader的Diffuse渲染代码来实现,方式一的代码:复制代码1.Shader"Hog'sshaders/BumpSpec_Twoside1"{Properties{_Color("MainColor",Color)=(1,1,1,1)_SpecColor("SpecularColor",Color)=(0.5,0.5,0.5,1)_Shininess("Shininess",Range(0.03,1))=0.078125_MainTex("Base(RGB)Gloss(A)",2D)="white"{}_BumpMap("Normalmap",2D)="bump"{}_BackColor("BackMainColor",Color)=(1,1,1,1)}10.SubShader{11.Tags{"RenderType"="Opaque"}LOD400Cullback14.CGPROGRAM#pragmasurfacesurfBlinnPhong17.18.sampler2D_MainTex;sampler2D_BumpMap;fixed4_Color;half_Shininess;23.structInput{float2uv_MainTex;float2uv_BumpMap;};28.voidsurf(InputIN,inoutSurfaceOutputo){fixed4tex=tex2D(_MainTex,IN.uv_MainTex);o.Albedo=tex.rgb*_Color.rgb;o.Gloss=tex.a;o.Alpha=tex.a*_Color.a;o.Specular=_Shininess;40.58.}o.Normal=UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));}ENDCG37.38.Cullfront39.CGPROGRAM#pragmasurfacesurfLambert42.43.sampler2D_MainTex;fixed4_BackColor;45.structInput{float2uv_MainTex;};49.voidsurf(InputIN,inoutSurfaceOutputo){fixed4c=tex2D(_MainTex,IN.uv_MainTex)*_BackColor;o.Albedo=c.rgb;o.Alpha=c.a;}ENDCG}FallBack"Specular"反面渲染的运算就直接借用了系统的DiffuseShader,只不过纹理是沿用正面的纹理,只增加了一个反面的颜色变量用来模拟环境光亮度,与纹理混合实现反面效果。渲染效果如下:方式二代码:复制代码Shader"Hog'sshaders/BumpSpec_Twoside2"{Properties{_Color("MainColor",Color)=(1,1,1,1)_SpecColor("SpecularColor",Color)=(0.5,0.5,0.5,1)_Shininess("Shininess",Range(0.03,1))=0.078125_MainTex("Base(RGB)Gloss(A)",2D)="white"{}_BumpMap("Normalmap",2D)="bump"{}_BackColor("BackMainColor",Color)=(1,1,1,1)_BackMainTex("BackBase(RGB)Gloss(A)",2D)="white"{}}SubShader{Tags{"RenderType"="Opaque"}LOD400Cullback15.CGPROGRAM#pragmasurfacesurfBlinnPhong18.19.sampler2D_MainTex;sampler2D_BumpMap;fixed4_Color;half_Shininess;24.structInput{float2uv_MainTex;float2uv_BumpMap;};29.voidsurf(InputIN,inoutSurfaceOutputo){fixed4tex=tex2D(_MainTex,IN.uv_MainTex);o.Albedo=tex.rgb*_Color.rgb;o.Gloss=tex.a;o.Alpha=tex.a*_Color.a;o.Specular=_Shininess;o.Normal=UnpackNormal(tex2D(_BumpMap,IN.uv_BumpMap));}ENDCG38.39.Cullfront41.CGPROGRAM#pragmasurfacesurfLambert43.44.sampler2D_BackMainTex;fixed4_BackColor;46.47.structInput{48.float2uv_BackMainTex;};50.voidsurf(InputIN,inoutSurfaceOutputo){fixed4c=tex2D(_BackMainTex,IN.uv_BackMainTex)*_BackColor;o.Albedo=c.rgb;o.Alpha=c.a;}ENDCG}FallBack"Specular"}此方式下反面可以单独指定纹理,不指定就直接显示指定的反面颜色,渲染效果如下以上只是介绍一个基本思想,在这个基础上能应该能衍生出无穷的变化。对自定义shader有兴趣的可以参考系统手册和Nvidia的CG教学手册。不过千万不要动不动就使用双面材质,因为会增加系统负荷,应该只用在需要的地方。把以上代码起个名字另存为.shader文件,导入工程assets,就能直接使用。
/
本文档为【Unity双面渲染shader】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索