unity性能最高的Shader:Unlit

来源:互联网 发布:树莓派开源人工智能 编辑:程序博客网 时间:2024/06/05 05:07

原文链接:http://www.jianshu.com/p/f6a0b6037ada

unity性能最高的Shader: Unlit

材质分类

1.现在游戏常用材质分为PBR(Standard)和不受光材质(Unlit).
2.次世代游戏用的是PBR材质,其中最基本的是4张贴图:颜色贴图,Normal贴图,AO贴图环境阻塞贴图,高光贴图.
3.不受光材质:像魔兽世界把特效关闭, 一个模型的只靠最基本的颜色贴图, 游戏中的灯光用的也是图片模拟的光晕, 材质根本不受光. 我自己把这种材质成为不受光材质. 网上的浦贵,车希刚等大神用的就是这个技术,低模一个颜色贴图足够.特别适合现在的移动端游戏.
4.由于不受光材质比PBR的性能高出太多,PBR的浮点计算量大概是PBR4个贴图都用上的10几倍.所以我自己决定下一款产品使用不受光材质.

理念

1.把美术的质量交给手绘颜色贴图而不是显卡做过多的计算.
2.把内存留出来,给单张颜色贴图更大的尺寸,让画面更多细节.
3.把GPU,CPU性能空出来,留给粒子特效和更细腻的骨骼动画.
4.降低手机发热,玩家才能长时间玩你的游戏.

缺点

1.对美术人员要求较高.
2.视觉风格有所限制.

Shader

性能极限的Shader

除了使用一张颜色贴图,没做任何其他额外的浮点运算,并且使用的都是fixed4低精度浮点.如图:


左为Unlit, 右为Standard


shader如下:

Shader "_self/Unlit"{    Properties{        _MainTex("texture", 2D) = "black"{}    }    SubShader{        LOD 100        Pass{            CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"            sampler2D _MainTex;            fixed4 _MainTex_ST;            struct vIn{                half4 vertex:POSITION;                float2 texcoord:TEXCOORD0;                fixed4 color:COLOR;            };            struct vOut{                half4 pos:SV_POSITION;                float2 uv:TEXCOORD0;                fixed4 color:COLOR;            };            vOut vert(vIn v){                vOut o;                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);                //                o.uv = v.texcoord.xy; //使用TRANSFORM_TEX才可以映射UV的Tiling和Offset的值                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);                o.color = v.color;                return o;            }            fixed4 frag(vOut i):COLOR{                fixed4 tex = tex2D(_MainTex, i.uv);                return tex * i.color;            }            ENDCG        }    }}

使用了一次颜色叠加的Shader

项目中为了方便,经常需要修改材质颜色, 在之前的基础上添加了颜色修改和颜色叠加.'
之所以AddColor用的float4而不是color, 是因为颜色拾色器只能在0-1的区间, 如果要比原图亮, 就得用大于1的值, 如图


右边的使用大于1的值做的曝光

注意.如果两个模型共用一个材质,修改mainColor,两个模型会一起修改颜色.
Shader如下:

Shader "_self/Unlit Color"{    Properties{        _MainTex("texture", 2D) = "black"{}        _Color ("add color", float) = (1, 1, 1, 1)    }    SubShader{        LOD 100        Pass{            CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"            sampler2D _MainTex;            fixed4 _MainTex_ST;            fixed4 _Color;            struct vIn{                half4 vertex:POSITION;                float2 texcoord:TEXCOORD0;                fixed4 color:COLOR;            };            struct vOut{                half4 pos:SV_POSITION;                float2 uv:TEXCOORD0;                fixed4 color:COLOR;            };            vOut vert(vIn v){                vOut o;                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);                o.color = v.color;                return o;            }            fixed4 frag(vOut i):COLOR{                fixed4 tex = tex2D(_MainTex, i.uv);                return tex * (i.color * _Color);            }            ENDCG        }    }}

支持Alpha通道的Shader

以上的贴图为了性能都不支持Alpha通道过渡, 并且如果要开Alpha必须把ZWrite关闭, 当ZWrite关闭之后, 两个模型如果交叉, 他们的层级会出问题, 具体表现就是有的时候会前后错位, 我们看官方默认的Unlit中支持Alpha的也是一样.
所以除非必要. 尽量少用带Alpha的Shader.
效果如图:


可以看到蓝色的区域很均匀的做了alpha过渡


Shader如下

Shader "_self/Unlit Color Alpha"{    Properties{        _MainTex("texture", 2D) = "black"{}        _Color ("add color", float) = (1,1,1,1)    }    SubShader{        Tags { "QUEUE"="Transparent" "IGNOREPROJECTOR"="true" "RenderType"="Transparent" }        ZWrite Off        Blend SrcAlpha OneMinusSrcAlpha        LOD 100        Pass{            CGPROGRAM#pragma vertex vert#pragma fragment frag#include "UnityCG.cginc"            sampler2D _MainTex;            fixed4 _MainTex_ST;            fixed4 _Color;            struct vIn{                half4 vertex:POSITION;                float2 texcoord:TEXCOORD0;                fixed4 color:COLOR;            };            struct vOut{                half4 pos:SV_POSITION;                float2 uv:TEXCOORD0;                fixed4 color:COLOR;            };            vOut vert(vIn v){                vOut o;                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);                o.color = v.color;                return o;            }            fixed4 frag(vOut i):COLOR{                fixed4 tex = tex2D(_MainTex, i.uv);                return tex * (i.color * _Color);            }            ENDCG        }    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婴儿鼻塞睡不好觉怎么办 玩英雄联盟鼠标变亮白怎么办 练芭蕾脚受伤了怎么办 高三了英语30分怎么办 要上高中了英语不好怎么办 高二了数学不好怎么办 高二函数不好怎么办啊 输乳怎么办腺病有什么妇症状 屁股上坐的发黑怎么办 车屁股撞了个洞怎么办 腰压迫的腿疼怎么办 肩胛提肌固定不住怎么办 胳膊粗后背肉多怎么办 2岁儿童 肋骨边缘外翻怎么办 5岁宝宝盆骨前倾怎么办 脖子弯了像驼背怎么办 都40周了还没生怎么办 股骨头坏死骨盆歪了怎么办 二胎侧切伤口疼怎么办 小月子盆骨酸痛怎么办 盆骨一边大一边小怎么办 快生了宫颈管长怎么办 想顺产 宫颈管长怎么办 腰和跨一样宽怎么办 脚后跟骨折手术后小腿变细怎么办 生完孩子骨盆错位怎么办 皮肤又黑又粗糙怎么办 翠研珠宝被坑了怎么办 领导是小人我该怎么办 微信二维码重置了怎么办 衣服有蝽的卵怎么办 人坐牢去了房贷怎么办 人死了欠的房贷怎么办 体育生文化没过怎么办 舍友偷了钱没证据怎么办 舍友要一直开空调怎么办 和大学室友相处不愉快怎么办 和舍友三观不合怎么办 室友欠200钱忘了怎么办 和舍友闹矛盾了怎么办 被宿舍人孤立了怎么办