本文是视频课程《Unity技术美术TA:Shader篇》,算是对自己学习的总结,也希望分享下所学知识~~
1.目标级别
Shader Model(SM)
微软剔除,要求显卡厂商按级别提供对应的功能与指令支持
不同的 SM 包含不同的指令集与 Shader 规范
Shader如何编译目标级别
两种方式
1.指定特性
#pragma require xxx
表明shader需要的特性功能
eg:interpolators10:至少需要10个插值器(从顶点到片断)
2.指定编译目标
#pragma target 2.0(默认是2.5)
可以通过 #if SHADER_TARGET< 30 做分支判断
可以做一些效果再高中低配之间的不同
代码如下:
Shader "Custom/TA/ShaderTarget"
{
CGINCLUDE
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
v2f vert(appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
//根据目标平台不同,走不同的渲染逻辑
#if (SHADER_TARGET < 30)
return 1;
#elif
return 0;
#endif
}
ENDCG
//高配
SubShader
{
Tags
{
"RenderType"="Opaque"
}
LOD 400
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//编译目标
#pragma target 3.0
ENDCG
}
}
//低配
SubShader
{
Tags
{
"RenderType"="Opaque"
}
LOD 200
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//编译目标
//比如 最大支持贴图uv就是8张
#pragma target 2.0
ENDCG
}
}
}
2.目标渲染器
Unity做了一件事 Shader 是一份,会编译成各种不同平台的代码
但是我们只需要在手机生成,不需要PC平台生成
好处:少了很多代码,时间和内存都会更优化
缺点:无法正常显示
如何实现?
1.#pragma exclude_renderers
剔除目标渲染器
2.#pragma only_renderers
只进行目标渲染器
代码如下:
//多个中间用空格隔开
#pragma exclude_renderers d3d11 gles gles3
#pragma only_renderers d3d11 gles gles3
注意:
只优化编译时间和一点点内存占用
对运行时效率没有影响