伏雨朝寒悉不胜,那能还傍杏花行。去年高摘斗轻盈。漫惹炉烟双袖紫,空将酒晕一衫青。人间何处问多情。 ———— 纳兰容若
URP
杂乱记录小tips
- URP中使用HLSL进行编写,代码块用HLSLPROGRAM和ENDHLSL来写
-
Passtag和subshadertag不一样
SubShader{Tags{"RenderPipeline"="UniversalPipeline"……}} Pass{Tags{"LightMode"="UniversalForward"}//说明这个Pass是一个渲染Pass ……}
3.Shader的除法尽可能少用,或者可以预计算一个分子————包括之前imposter和interior 别人写的代码都有这个特征。
URP中实际会包含多个Pass,但是只有一个渲染Pass,要让管线能区分这些不同,就需要给这些Pass给Tags进行标记。
-
表达不一样的常见情况
struct Attributes//这就是a2v ··struct Varings//这就是v2f TEXTURE2D(_BaseMap);//在CG中会写成sampler2D _MainTex;
//在CG里面,我们这样转换空间坐标 o.vertex = UnityObjectToClipPos(v.vertex); VertexPositionInputs positionInputs = GetVertexPositionInputs(IN.positionOS.xyz);
//在CG里,我们这样对贴图采样 fixed4 col = tex2D(_MainTex, i.uv); half4 baseMap = SAMPLE_TEXTURE2D(_BaseMap, sampler_BaseMap, IN.uv);
- CBUFFER
为了支持SRP Batcher(具体看前一篇),Shader中要将所有暴露出的参数(贴图除外)给包含到CBUFFER_START(UnityPerMaterial)与CBUFFER_END之间。并且为了保证之后的每个Pass都能拥有一样的CBUFFER,这一段代码需要写在SubShader之内,其它Pass之前。
CBUFFER_START(UnityPerMaterial)
float4 _BaseMap_ST;
float _Color;
CBUFFER_END
专题小tips
Render关键字
最近的需求里面有一个shader暴露key的需求,然后在shadergraph里面进行enum的时候发现了他们的一个不可解决的bug,所以决定手写。如果在shader里面写if显然是最笨的办法,所以这个时候用keyword来进行条件选择显然是最好的。可以跳转官方文档对keyword的标记以防忘记。 keyword有两种,一种是multicompile,一种是shaderfeature,查了官方文档,发现shader_feature和muliticompile的区别核心在于前者在build的时候就会把不要的代码去掉,而前者是可以在runtime的时候调用所有keyword。我们如果直接声明其实就是一个全局的shaderkeywordature,所以如非必要最好加_local。当然这个keyword是有数量限制的。 暴露成关键字参数只需:
[KeywordEnum(None,Normal,Vertex) DebugMode ("State",float) = 0 ]
#pragma shader_feature_local DEBUGMODE_NONE DEBUGMODE_NORMAL DEBUGMODE_VERTEX
#if DEBUGMODE_VERTEX
o.color=float4(1,0,0,1);
#elif DEBUGMODE_NORMAL
o.color=float4(0,1,0,1);
这个功能还封装了一些内置的render的宏,可以自行跳转unity官方文档查看。再提一嘴,Pragma target 和 pragma require的功能是,前者直接指定编译平台,后者根据需要的功能指定平台。
Tag
Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。 Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。 TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。 Background: Skybox shaders. 天空盒着色器。 Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。 TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。 TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。 TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。 Grass: terrain engine grass. 地形引擎中的草。 GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。