版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 砌体购销合同范本
- 2023年烟台市蓬莱区公立医院招聘考试真题
- 自创标准合同范本
- 2023年丽水地区录用公务员考试真题
- 依兰租房合同范本
- 2023年福州市马尾区招聘专职船管员考试真题
- 木工单项合同范本
- 2024零售店面改造装修协议范本
- 《找找三角形》全新解读
- 2024茶叶供销详细协议文档
- 人教版七年级地理上册:第二章+第二节海陆变迁海陆的变迁共38张PPT(三亚实验中学王玉芳)
- 半导体简答题
- 附件4:配网安健环设施标准配置
- 办公室工作流程图示
- (完整版)营销策划服务清单
- 产品标签模板
- OBE理念与人才培养方案制定PPT课件
- 离任审计工作方案 样稿
- 四大名著称四大小说三国演义西游记水浒传红楼梦中国古典章回小说PPT资料课件
- 港珠澳大桥项目管理案例分析PPT课件
- GB∕T 12810-2021 实验室玻璃仪器 玻璃量器的容量校准和使用方法
评论
0/150
提交评论