双面渲染shader的制作_第1页
双面渲染shader的制作_第2页
双面渲染shader的制作_第3页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

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

2、l off 的方式 有个的缺陷,这材质从两面看无论贴图、颜色、反光、照明情况,都是一模一符合大多数实际情况的。在第 1 和第 2 种 Shader 里,是可以通过在一个渲染子程序里用两个渲染 Pass 来实现双面不同效果的,这部分很多,写起来也很简单直接。这里主要的是第三种也是最常用的 Surfahader 的双面不同效果的实现。Surfahader 是不能写在 Pass 里的,所以要实现它的双面不同效果就要用其他变通的办法。首先去 Unity一个内置 Shader 的代码包,/download_unity/builtin_shaders.zip如下:打开后看见一堆.shader 文件,可以用

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

4、3, 1) = 0.078125_Maex (Base (RGB) Gloss (A), 2D) = white _BumpMap (Normalmap, 2D) = bump SubShader Tags RenderType=Opaque LOD 400CGPROGRAM#pragma surfaurf BlinnPhongssler2D _Maex;ler2D _BumpMap;fixed4 _Color;half _Shininess;21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.struct Input float2 uv

5、_Maex;float2 uv_BumpMap;void surf (Input IN, inout SurfaceOutput o) fixed4 tex = tex2D(_Maex, IN.uv_Maex);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); ENDCGFallBack Specular简单解说一下几个关键行:第一行

6、 Shader Bumped Specular 指定了这个 shader 出现在 Unity 系统Shader 菜单里的名字,如果要修改系的源代码,最好把这个名字改掉,否则和系统内建 Shader 重名啦。我是这样写的: Shader Hogs shaders/BumpSpec_Twoside ,这个 shader 会出现在 Hogs shaders 组里,系统会自动完成这个加载。第二行 Properties 后面的一组以下划线开头的变量表示了这个渲染器需要设置的参数。对于一个高光-凹凸材质质颜色、反光颜色、反光率、材质贴图和法线贴图,这 5 个变量就对应这 5 个东西啦,详细请参考系统手册。

7、在第 11 行 LOD 400 后面加上一行:Cull off,这个材质就会自动双面渲染了 Cull off 表示双面都渲染,不写默认不渲染背面。你也可以写上 Cull front,不渲染正面。改完这行 ,把第一行改成你希望的名字,把这个 shader 文件拷贝到工程的 assets 目录效果如图:,系统就能自动加双面是双面了,但是哪有两面是一样亮、一样高光区域的,全透光的砖墙,这种双面很少会用到吧。如何做到双面不同效果呢?前面说了 Surfahader 是不能写两个 pass 渲染不同面的,但其实 surface 方式可以写多个渲染过程,根本不念,Surfa Call backhader 可

8、以这样写:渲染正面的代码Call front渲染的代码就可以实现双面不同的控制了。根据这个原理,其实只要把系统内建 shader 的源代码代码一份,就能实现另一面不同效果了。以下供参考1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.Shader Hogs shaders/BumpSpec_Twoside Properties /正面 5 个参数_Color (Main Color, Color) =

9、 (1,1,1,1)_SpecColor (Specular Color, Color) = (0.5, 0.5, 0.5, 1)_Shininess (Shininess, Range (0.03, 1) = 0.078125_Maex (Base (RGB) Gloss (A), 2D) = white _BumpMap (Normalmap, 2D) = bump 拷贝 改名 也是 5 个_BackColor (Back Main Color, Color) = (1,1,1,1)_BackSpecColor (Back Specular Color, Color) = (0.5, 0.

10、5, 0.5, 1)_BackShininess (Back Shininess, Range (0.03, 1) = 0.078125/_BackMaex (Back Base (RGB) Gloss (A), 2D) = white _BackBumpMap (Back Normalmap, 2D) = bump SubShader Tags RenderType=Opaque LOD 400Cull back/开始渲染正面 CGPROGRAM/表明是 surface 渲染方式 主渲染程序是 surf 光照模型是 BLinnPhong#pragma surfaurf BlinnPhongs

11、sler2D _Maex;ler2D _BumpMap;fixed4 _Color;half _Shininess;struct Input float2 uv_Maex;float2 uv_BumpMap;void surf (Input IN, inout SurfaceOutput o) fixed4 tex = tex2D(_Maex, IN.uv_Maex);o.Albedo = tex.rgb * _Color.rgb; o.Gloss = tex.a;o.Alpha = tex.a * _Color.a; o.Specular = _Shininess;o.Normal = Un

12、packNormal(tex2D(_BumpMap, IN.uv_BumpMap);ENDCG45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.Cull front/开始渲染 CGPROGRAM#pragma surfa其实和就是拷贝了一份正面渲染的代码 除了变量名要改urf BlinnPhongssler2D _BackMaex;ler2D _BackBumpMap;fixed4 _BackColor;half _BackShininess;struct Input float2

13、uv_BackMaex;float2 uv_BackBumpMap;void surf (Input IN, inout SurfaceOutput o) fixed4 tex = tex2D(_BackMaex, IN.uv_BackMaex);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);

14、 ENDCGFallBack Specular这是个双面可以分别指定的高光-凹凸材质,注意几个要点:properties 部分只能出现一次,所以这是不能直接拷贝的。因为要为双面指定不同的参数,双面的参数变量名这个里都是程序猿,没必要多解释了。我简单的把用于正面的 5 个参数前面都加上了一个 Back 用于。在 CG 代码也要对应的应用相应的参数,的渲染代码就用刚才全部加了 Back 的那 5 个参数。正面代码段用 Cull back 开始以下是渲染效果:的代码用 Cull front 开始一面是砖墙一面是木板。了没这个模式下,双面也完全可以指定不同的材质,基本上你不用学习很多内建 Shader

15、 和 CG 语法,通过简单的 co组合出无穷的双面材质来了。再一是二是一下,其实常用的双面效果,除了透明的材质以外,无非是两种:和正面同样纹理,但是不需要高光、反射,只需要一个相对黯淡的被环境光照亮的材质,比如砖墙木显示为单身或其他纹理,但也不需要高光、反射,只需要被环境光照亮,比如汽车建筑物等第一种情况,可以沿用正面纹理,但是以普通的 Diffuse 方式第二种情况,不指定或者单独指定纹理,也以普通的 Diffuse 方式的渲染都可以借用系统内建 Shader 的 Diffuse 渲染代码来实现,方式一的代码:两种情况,代码1.2.3.4.5.6.7.8.9.10.11.12.13.14.1

16、5.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.Shader Hogs shaders/BumpSpec_Twoside1 Properties _Color (Main Color, Color) = (1,1,1,1)_SpecColor (Specular Color, Color) = (0.5, 0.5, 0.5, 1)_Shininess (Shininess, Range (0.03, 1) = 0.078125_Maex (Base (RGB) Gloss (A

17、), 2D) = white _BumpMap (Normalmap, 2D) = bump _BackColor (Back Main Color, Color) = (1,1,1,1)SubShader Tags RenderType=Opaque LOD 400Cull backCGPROGRAM#pragma surfaurf BlinnPhongssler2D _Maex;ler2D _BumpMap;fixed4 _Color;half _Shininess;struct Input float2 uv_Maex;float2 uv_BumpMap;void surf (Input

18、 IN, inout SurfaceOutput o) fixed4 tex = tex2D(_Maex, IN.uv_Maex);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);ENDCGCull frontCGPROGRAM#pragma surfaurf Lambert43.44.45.46.47.48.49.50.51.52.

19、53.54.55.56.57.58.sler2D _Maex;fixed4 _BackColor;struct Input float2 uv_Ma;ex;void surf (Input IN, inout SurfaceOutput o) fixed4 c = tex2D(_Ma o.Albedo = c.rgb;o.Alpha = c.a;ex, IN.uv_Maex) * _BackColor; ENDCGFallBack Specular渲染的运算就直接借用了系统的 Diffuse Shader,只不过纹理是沿用正面的纹理,只增加了一个的颜色环境光亮度,与纹理混合实现效果。渲染效果如

20、下:方式二代码:代码1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.Shader Hogs shaders/BumpSpec_Twoside2 Properties _Color (Main Color, Color) = (1,1,1,1)_SpecColor (Specular Color, Color) = (0.5, 0.5, 0.5, 1)_Shininess (Shininess, Range (0.03, 1) = 0.078125_Maex (Base (RGB) Gloss (A), 2D) = white _Bum

21、pMap (Normalmap, 2D) = bump _BackColor (Back Main Color, Color) = (1,1,1,1)_BackMaex (Back Base (RGB) Gloss (A), 2D) = white SubShader Tags RenderType=Opaque LOD 400Cull backCGPROGRAM#pragma surfaurf BlinnPhongssler2D _Maex;ler2D _BumpMap;22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.58.59.此方式下fixed4 _Color;half _Shininess;struct Input

温馨提示

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

评论

0/150

提交评论