Unity双面渲染shader
Unity双面渲染shader
双面渲染shader
Unity内置的Shader,都是单面效果,想必导入Mesh的同学都碰到过这样的痛苦,布料飘起的背面部分看起来是空气,汽车透过车窗看到是路面...各种蛋疼。
有些文章教导大家把模型做出厚度来吧,这种做法实在太那个啥了......
其实用改写Shader的方法可以很方便的实现双面材质。
Unity里有3种Shader方式:
1.Fixed Function Shaders
2.Vertex and Fragment Shaders
3. Surface Shaders
关于这部分的详细介绍,请参考官方的教程。
这三种方式里,都可以通过直接在Shader代码头部添加一个Cull off 语句,实现强制双面渲染。
但是直接用Cull off的方式有个重大的缺陷,这材质从两面看无论贴图、颜色、反光、照明情况,都是一模一样的,这并不符合大多数实际情况的常识。
在第1和第2种Shader里,是可以通过在一个渲染子程序里用两个渲染Pass来实现双面不同效果的,这部分网上的资料也很多,写起来也很简单直接。
这里主要讨论的是第三种也是最常用的Surface Shader的双面不同效果的实现。
Surface Shader是不能写在Pass里的,所以要实现它的双面不同效果就要用其他变通的办法。
首先去Unity官方网站下载一个内置Shader的代码包,链接如下:
/download_unity/builtin_shaders.zip
打开后看见一堆.shader文件,可以用任何文本编辑器打开。可以看见系统内建的Shader基本都是Surface方式。
这里随便打开一个Normal-BumpSpec.Shader这是普通的高光-凹凸贴图材质
Unity双面渲染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.078125
6. _MainTex ("Base (RGB) Gloss (A)", 2D) = "white" {}
7. _BumpMap ("Normalmap", 2D) = "bump" {}
8.}
9.SubShader {
10. Tags { "RenderType"="Opaque" }
11. LOD 400
12.
13.CGPROGRAM
14.#pragma surface surf BlinnPhong
15.
16.
17.sampler2D _MainTex;
18.sampler2D _BumpMap;
19.fixed4 _Color;
20.half _Shininess;
21.
22.struct Input {
23. float2uv_MainTex;
Unity双面渲染shader
24. float2uv_BumpMap;
25.};
26.
27.void surf (Input IN, inoutSurfaceOutput o) {
28. fixed4tex = 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.ENDCG
36.}
37.FallBack "Specular"
38.}
简单解说一下几个关键行:
第一行Shader "Bumped Specular" 指定了这个shader出现在Unity系统Shader菜单里的名字,如果要修改系统内建Shader的源代码,最好把这个名字改掉,否则和系统内建Shader重名啦。我是这样写的: Shader "Hog's shaders/BumpSpec_Twoside" ,这个shader会出现在Hog's shaders组里,系统会自动完成这个加载。
第二行Properties后面的一组以下划线开头的变量表示了这个渲染器需要设置的参数。对于一个高光-凹凸材质来说,需要材质颜色、反光颜色、反光率、材质贴图和法线贴图,这5个变量就对应这5个东西啦,详细请参考系统手册。
在第11行LOD 400 后面加上一行:Cull off,这个材质就会自动双面渲染了 Cull off表示双面都渲染,不写默认是Cull back,不渲染背面。你也可以写上Cull front,不渲染正面。
Unity双面渲染shader
改完这行,把第一行改成你希望的名字,把这个shader文件拷贝到工程的assets目录底下,系统就能自动加载啦。
效果如图:
双面是双面了,但是哪有两面是一样亮、一样高光区域的....,全透光的砖墙,这种双面很少会用到吧。
如何做到双面不同效果呢?
前面说了Surface shader是不能写两个pass渲染不同面的,但其实surface方式可以写多个渲染过程,根本不需要pass的概念,Surface Shader可以这样写:
Call back
渲染正面的代码
Call front
渲染反面的代码
就可以实现双面不同的控制了。
根据这个原理,其实我们只要把系统内建shader的源代码复制一份,就能实现另一面不同效果了。以下供参考:
复制代码
1.Shader "Hog's shaders/BumpSpec_Twoside" {
2.Properties {
3.//正面5个参数
4. _Color ("Main Color", Color) = (1,1,1,1)
5. _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 1)
6. _Shininess ("Shininess", Range (0.03, 1)) = 0.078125
Unity双面渲染shader
7. _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. _BackShininess ("Back Shininess", Range (0.03, 1)) = 0.078125
13. _BackMainTex ("Back Base (RGB) Gloss (A)", 2D) = "white" {}
14. _BackBumpMap ("Back Normalmap", 2D) = "bump" {}
15.}
16.SubShader {
17.Tags { "RenderType"="Opaque" }
18. LOD 400
19. Cull back
20.//开始渲染正面
21.CGPROGRAM
22.//表明是surface渲染方式主渲染程序是surf 光照模型是BLinnPhong
23.#pragma surface surf BlinnPhong
24.
25.
26.sampler2D _MainTex;
27.sampler2D _BumpMap;
28.fixed4 _Color;
29.half _Shininess;
30.
Unity双面渲染shader
31.struct Input {
32. float2uv_MainTex;
33. float2uv_BumpMap;
34.};
35.
36.void surf (Input IN, inoutSurfaceOutput o) {
37. fixed4tex = tex2D(_MainTex, IN.uv_MainTex);
38. o.Albedo = tex.rgb * _Color.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.ENDCG
44.
45.
…… 此处隐藏:3419字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [专业资料]《蜜蜂之家》教学反思
- [专业资料]过去分词作定语和表语1
- [专业资料]苏州工业园区住房公积金贷款申请表
- [专业资料]保安管理制度及处罚条例细则
- [专业资料]2018年中国工程咨询市场发展现状调研及
- [专业资料]2015年电大本科《学前教育科研方法》期
- [专业资料]数字信号处理实验 matlab版 离散傅里叶
- [专业资料]“十三五”重点项目-虎杖白藜芦醇及功
- [专业资料]2015-2020年中国竹木工艺市场需求及投
- [专业资料]国际贸易理论与实务作业五:理论案例分
- [专业资料]财政部修订发布事业单位会计制度
- [专业资料]BCA蛋白浓度测定试剂盒(增强型)
- [专业资料]工程进度总计划横道图模板(通用版)
- [专业资料]七年级地理同步练习(天气与气候)
- [专业资料]X光安检机介绍火灾自动报警系统的组成
- [专业资料]衢州市人民政府办公室关于印发衢州市区
- [专业资料]经济全球化及其影响[1]
- [专业资料]质粒DNA限制性酶切图谱分析
- [专业资料]国家安全人民防线工作“六项”制度
- [专业资料]劳动力投入计划及保证措施
- 电子账册联网监管培训手册
- 人教版语文七年级上第1课《在山的那边
- 对我区担保行业发展现状的思考与建议
- 平面四边形网格自动生成方法研究
- 2016年党课学习心得体会范文
- 如何设置电脑定时关机
- 全球最美人妖排行榜新鲜出炉
- 社会实践调查报告及问卷
- Visual Basic习题集
- 《鱼我所欲也》课件2
- 浙江省会计从业资格考试试卷
- 全遥控数字音量控制的D 类功率放大器资
- 鞍钢宪法与后福特主义
- 电表的改装与校准实验报告(1)
- 2014年高考理科数学真题解析分类汇编:
- Windows 7 AIK 的使用
- 风电场全场停电事故应急处置方案
- 化工原理选填题题库(下)
- 关于产学研合作教育模式的学习与思考
- 西安先锋公馆项目前期定位报告




