UnityShader常见指令、标签函数等

    xiaoxiao2025-05-01  32

    文章目录

    1.Properties块中的特殊命令4.三、Pass块中的指令5.Pass块中的Tag标签6.#prama指令7.Unity内置函数8.Unity内置变量9.语义10.宏定义

    1.Properties块中的特殊命令

    命令参数说明[Header(test)]括号内即为头标题的显示文字不要加引号,不支持中文[NoScaleOffset]隐藏贴图的Tilling和Offset选项[Toggle]模拟开关,0为假,1为真,同[MaterialToggle] ## 2.SubShader块中的渲染状态设置指令 指令参数说明CullCull Back/Front/Off剔除模式ZTestZTest Less/Greater/Equal/LEqual/GEqual/NotEqual/Always深度测试ZWriteZWrite On/Off深度写入BlendBlend xx颜色混合模式 Blend比较复杂,包含以下几种形式: 1. Blend Off 关闭颜色混合模式,默认值 2. Blend SrcFactor DstFactor 最终颜色 = SrcFactor*源颜色(即计算出来的片元颜色值) + DstFactor*目标颜色(即颜色缓冲区中的颜色值) 3. Blend SrcFactor DstFactor,SrcFactorA DstFactorA 与2相似,只是把Alpha通道分离出来了 上述SrcFactor和DstFactor的值可以为以下任一值: 指令值One1Zero0SrcColor源颜色SrcAlpha源透明度DstColor目标颜色DstAlpha目标透明度OneMinusSrcColor1 - 源颜色OneMinusSrcAlpha1 - 源透明度OneMinusDstColor1 - 目标颜色OneMinusDstAlpha1 - 目标透明度 4. Blend Op 采用操作符进行计算 指令值Add源颜色 + 目标颜色Sub源颜色 - 目标颜色RevSub目标颜色 - 源颜色Min取源颜色和目标颜色中的较小者Max取源颜色和目标颜色中的较大者 5. Blend OpColor,OpAlpha 与4相似,只是把透明通道分离出来了 ## 3.SubShader块中的Tag标签 标签类型值说明QueueBackground/Geometry/AlphaTest/Transparent/Overlay对应值为1000/2000/2450/3000/4000RenderTypeOpaque/Transparent/TransparentCutout/ Background/Overlay/TreeOpaque/TreeTransparentCutout/ TreeBillboard/Grass/GrassBillboard用于替代渲染和获取场景深度和法线信息DisableBatchingtrue/false禁用批处理ForceNoShadowCastingtrue/false禁止投射阴影IgnoreProjectortrue/false忽略Projector,通常用于半透明物体CanUseSpriteAtlastrue/false当该SubShader用于Sprite时用falsePreviewTypePlane/SkyBox预览形状

    4.三、Pass块中的指令

    1.Name “MYPASSNAME” 为该Pass命名,用于在其他Shader中通过UsePass命令调用该Pass,即使使用小写字母命名,Unity也会自动转为大写字母,所以UsePass命令中也需写成大写字母 2.GrabPass { “TextureName”} 抓取屏幕并生成纹理,TextureName为自定义纹理名称,默认为_GrabTexture

    5.Pass块中的Tag标签

    标签类型值说明LightModeAlways/ForwardBase/ForwardAdd/Deferred/ShadowCaster/ MotionVectors/PrepassBase/PrepassFinal/Vertex/VertexLMRGBM/VertexLM详见官方文档PassFlags OnlyDirectional仅传送主平行光、环境光和LightProbe的光照数据RequireOptions SoftVegetation满足给定条件才渲染该Pass

    6.#prama指令

    指令值说明target2.0/2.5(default)/3.0/3.5(es3.0)/ 4.0/4.5(es3.1)/4.6(gl4.1)/5.0geometry用于geometry shader,编译目标自动设为4.0hull用于tessellation shader,编译目标自动设为4.6domain同hullvertex顶点函数名定义顶点函数入口fragment片元函数名定义片元函数入口only_renderersd3d9/d3d11/opengl/gles/xbox360/p3/flash指定渲染平台exclude_renderers同only_renderers排除指定平台multi_compile_fwdadd_fullshadows开启ForwardAdd中的阴影效果multi_compile_fwdbase用于ForwardBase,保证光照衰减等光照变量被正确赋值multi_compile_fwdadd用于ForwardAdd,保证光照衰减等光照变量被正确获取

    7.Unity内置函数

    函数说明float4 UnityObjectToClipPos(float3 pos)将顶点坐标从模型空间转换到裁剪空间float3 UnityObjectToViewPos(float3 pos)将顶点坐标从模型空间转换到观察空间TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)根据贴图的tilling和offset值计算uv,需要定义变量“贴图名称_ST”,例:_MainTex_STComputeScreenPos(float4 pos)计算顶点在屏幕空间的位置float3 WorldSpaceViewDir(float4 v)输入顶点位置,输出世界空间下顶点到摄像机的方向float3 UnityWorldSpaceViewDir(float4 v)输入一个世界顶点,输出世界空间下该点到摄像机的方向float3 ObjSpaceViewDir(float4 v)输入顶点位置,输出模型空间下顶点到摄像机的方向float3 WorldSpaceLightDir(float4 v)仅用于前向渲染,输入顶点位置,输出世界空间下顶点到光源的方向float3 UnityWorldSpaceLightDir(float4 v)仅用于前向渲染,输入一个世界坐标,输出世界空间下该点到光源的方向float3 ObjSpaceLightDir(float4 v)仅用于前向渲染,输入顶点位置,输出模型空间下顶点到光源的方向float3 UnityObjectToWorldNormal(float3 norm)将法线方向从模型空间转换到世界空间float3 UnityObjectToWorldDir(in float3 dir)将方向从模型空间转换到世界空间float3 UnityWorldToObjectDir(float3 dir)将方向从世界空间转换到模型空间SHADOW_COORDS(i)放在FrowardBase渲染路径下顶点函数的输出结构体中,需引用”AutoLight.cginc”,i是可用寄存器索引 用于声明阴影纹理的坐标TRANSFER_SHADOW(o)计算结果即为阴影纹理的坐标,o为输出结构体,需放在顶点函数中SHADOW_ATTENUATION(i)计算阴影衰减值,需放在片元函数中,i为片元函数的输入结构体,即上式中的o 注意:以上三个函数使用时,需保证顶点函数的输入结构体变量为v,结构体的顶点坐标为vertex,输出结构体中的顶点坐标为posfloat2 ParallaxOffset (half h, half height, half3 viewDir)为视差法线贴图计算UV偏移fixed Luminance (fixed3 c)将颜色转换为亮度(灰度)fixed3 DecodeLightmap (fixed4 color)从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR)float4 EncodeFloatRGBA (float v)为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色float DecodeFloatRGBA (float4 enc)解码RGBA颜色到floatfloat2 EncodeFloatRG (float v)类似EncodeFloatRGBAfloat DecodeFloatRG (float2 enc)类似DecodeFloatRGBAfloat2 EncodeViewNormalStereo (float3 n)编码视图空间法线到在0到1范围的两个数float3 DecodeViewNormalStereo (float4 enc4)从enc4.xy解码视图空间法线

    8.Unity内置变量

    UNITY_MATRIX_MVP将顶点/方向从模型空间转换到裁剪空间UNITY_MATRIX_MV将顶点/方向从模型空间转换到观察空间UNITY_MATRIX_V将顶点/方向从世界空间转换到观察空间UNITY_MATRIX_P将顶点/方向从观察空间转换到裁剪空间UNITY_MATRIX_VP将顶点/方向从世界空间转换到裁剪空间UNITY_MATRIX_T_MVUNITY_MATRIX_MV的转置矩阵UNITY_MATRIX_IT_MVUNITY_MATRIX_MV的逆转置矩阵,可将法线从模型空间转换到观察空间_Object2World将顶点/方向从模型空间转换到世界空间,已修改为unity_ObjectToWorld_World2Object将顶点/方向从世界空间转换到模型空间,已修改为unity_WorldToObject_WorldSpaceCameraPos当前渲染的相机在世界空间中的位置_ProjectionParamsx=1(-1),y=near,z=far,w=1+1/far,near和far是近远裁屏幕到相机的距离_ScreenParamsx=width,y=height,z=1+1/width,w=1+1/height_ZBufferParamsx=1-far/near,y=far/near,z=x/far,w=y/farunity_OrthoParamsx=正交投影相机的宽度,y=正交投影相机的高度,z未定义,w=1(正交相机)/0(透视相机)unity_CameraProjection该相机的投影矩阵unity_CameraInvProjection该相机的投影矩阵的逆矩阵unity_CameraWorldClipPlanes[6]该相机的6个裁剪屏幕在世界空间下的等式,存储顺序:左右下上近远UNITY_LIGHTMODEL_AMBIENT前向渲染下的环境光信息_LightColor0光源颜色_WorldSpaceLightPos0光源方向_LightMatrix0世界空间到光源空间的变换矩阵unity_4LightPosX0仅用于ForwardBase,前4个非重要光源的世界空间下的x坐标unity_4LightPosY0仅用于ForwardBase,前4个非重要光源的世界空间下的y坐标unity_4LightPosZ0仅用于ForwardBase,前4个非重要光源的世界空间下的z坐标unity_4LightAtten0仅用于ForwardBase,前4个非重要光源的衰减因子unity_LightColor数组,仅用于ForwardBase,前4个非重要光源的颜色_Timet/20,t,2t,3t)_SinTime(t/8,t/4,t/2,t)_CosTime(t/8,t/4,t/2,t)unity_DeltaTime(dt, 1/dt, smoothDt, 1/smoothDt)_CameraDepthTexture深度纹理,使用SAMPLE_DEPTH_TEXTURE函数获取深度值,使用Linear01Depth线性化深度值_CameraDepthNormalsTexture深度法线纹理,使用DecodeViewNormalStereo(tex2D(_CameraDepthNormalsTexture,i.uv).xy)获取[-1,1]之间的法线值unity_SpecCube0天空盒贴图unity_SpecCube0_HDR用来解码天空盒颜色:DecodeHDR(UNITY_SAMPLE_TEXCUBE(unity_SpecCube0,i.worldRefl),unity_SpecCube0_HDR)

    9.语义

    语义说明VPOS 屏幕坐标,x=ScreenWidth+0.5,y=ScreenHeight+0.5, z=[0(near),1(far)],w=1(正交投影)/[1/near,1/far](透视投影) WPOS同VPOS 注:使用这两个语义定义的输入input可得到视口空间坐标:input.xy/_ScreenParams.xy 另一种等价方法:顶点函数中用ComputeScreenPos计算屏幕空间坐标,再在片元函数中用结果srcPos.xy/srcPos.w

    10.宏定义

    宏说明UNITY_UV_STARTS_AT_TOP判断当前平台是否DirectX,一半配合_MainTex_TexelSize.y(负数说明开启了抗锯齿)进行uv反转USING_DIRECTIONAL_LIGHT判断是否使用平行光
    最新回复(0)