Tech · ArtShaderUnity

「Unity」肠更帖 URP HLSL编写热知识

by Ayse, 2022-04-21


URP

WechatIMG514.png


杂乱记录小tips

  1. URP中使用HLSL进行编写,代码块用HLSLPROGRAM和ENDHLSL来写
  2. Passtag和subshadertag不一样

    SubShader{Tags{"RenderPipeline"="UniversalPipeline"……}} Pass{Tags{"LightMode"="UniversalForward"}//说明这个Pass是一个渲染Pass ……}

    3.Shader的除法尽可能少用,或者可以预计算一个分子————包括之前imposter和interior 别人写的代码都有这个特征。

URP中实际会包含多个Pass,但是只有一个渲染Pass,要让管线能区分这些不同,就需要给这些Pass给Tags进行标记。

  1. 表达不一样的常见情况

    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);

  2. 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的标记以防忘记。 未命名图片.png 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. 地形引擎何中的广告牌草。

作者: Ayse

2024 © typecho & elise