[学习笔记][Unity][Shader]ShaderLab知识梳理

Unity文档:https://docs.unity3d.com/Manual/SL-Reference.html

属性定义

数字和滑块:

name ("display name", Range (min, max)) = number
name ("display name", Float) = number
name ("display name", Int) = number

颜色和向量:

name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)

贴图:

name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}
name ("display name", 3D) = "defaulttexture" {}

对于2D贴图,默认值为一个空字符串或内置的默认贴图之一: “white” (RGBA: 1,1,1,1), “black” (RGBA: 0,0,0,0), “gray” (RGBA: 0.5,0.5,0.5,0.5), “bump” (RGBA: 0.5,0.5,1,0.5) or “red” (RGBA: 1,0,0,0)

对于非2D贴图(Cube, 3D, 2DArray) 默认值是一个空字符串。如果没有为材质指定Cubemap/3D/Array贴图,则使用灰色(RGBA:0.5,0.5,0.5,0.5)。

可以通过在声明语句前添加以下前缀实现不同的效果:
[HideInInspector] -在材质面板中不显示该属性。
[NoScaleOffset] -材质面板将不显示该纹理属性的纹理平铺/偏移字段。
[Normal] -表示该纹理属性需要法线贴图。
[HDR] -表示该纹理属性需要HDR贴图。
[Gamma]-表示将float / vector属性指定为sRGB值,(就像颜色一样),并且可能需要根据使用的颜色空间进行转换。
[PerRendererData]-指示纹理属性将以MaterialPropertyBlock的形式来自每个渲染器数据。材质检查器更改了这些属性的纹理插槽UI。(没看懂啥意思)

SubShader

SubShader标签

语法:

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }

渲染顺序 - Queue标签

Background-此渲染队列先于其他任何队列渲染。用于确定位于背景上的东西。
Geometry (默认) -用于大多数对象。不透明几何使用此队列。
AlphaTest-需要Alpha测试的几何使用此队列。它是一个单独的队列,Geometry因为在绘制所有非透明物 体后,渲染需要Alpha测试的对象效率更高。
Transparent-此渲染队列以从后到前的顺序在Geometry和AlphaTest之后渲染。任何与alpha混合的内容(即不写入深度缓冲区的着色器)都应放在此处(玻璃,粒子效果)。
Overlay-此渲染队列用于叠加效果。最后渲染的任何东西都应该放在这里(例如镜头光晕)。

Background是1000,Geometry是2000,AlphaTest是2450,Transparent是3000和Overlay4000。
如果着色器使用这样的队列:

Tags { "Queue" = "Geometry+1" }

这将使对象在所有不透明对象之后但在透明对象之前被渲染,因为渲染队列索引将为2001(几何加1)。在希望始终在其他对象集之间绘制某些对象的情况下,这很有用。例如,在大多数情况下,应在不透明物体之后但在透明物体之前绘制透明水。

最多2500个队列(“ Geometry + 500”)被认为是“不透明的”,并优化了对象的绘制顺序以获得最佳性能。对于“透明对象”,应考虑使用较高的渲染队列,并按距离对对象进行排序,从最远的对象开始渲染,以最接近的对象结束。天空盒绘制在所有不透明对象和所有透明对象之间。

RenderType标签

RenderType标记将着色器分类为几个预定义的组,例如,是不透明的着色器,还是经过alpha测试的着色器等。“ 着色器替换”使用此着色器,在某些情况下用于生成相机的深度纹理。

DisableBatching标签

使用“ 绘制调用批处理”时,某些着色器(主要是进行对象空间顶点变形的着色器)不起作用-这是因为批处理将所有几何体转换为世界空间,因此丢失了“对象空间”。

DisableBatching标签可以用来表明这一点。共有三个可能的值:“ True”(始终禁用此着色器的批处理),“ False”(不禁用批处理;这是默认设置)和“ LODFading”(当LOD fading处于活动状态时禁用批处理;主要在trees上使用(这个trees应该是指植被))。

ForceNoShadowCasting标签

如果ForceNoShadowCasting标签给定了值且其值为“ True”,则使用此子着色器渲染的对象将永远不会投射阴影。 这通常用于,当你使用“shader替换”在透明物体上而你并不想从其他subshader中继承shadow pass时。

IgnoreProjector标签

如果IgnoreProjector标签给定了值且其值为“ True”,则使用此明暗器的对象将不受Projectors的影响。这在半透明物体上非常有用,因为Projectors没有好的方法来影响它们。

CanUseSpriteAtlas标签

如果shader用于精灵,则将CanUseSpriteAtlas标记设置为“False”,当它们被打包到地图集中时将不起作用(请参见Sprite Packer)。

PreviewType标签

PreviewType指定材质预览窗口中应如何显示材质。默认情况下,材质显示为球体,但PreviewType也可以设置为“Plane”(将显示为2D)或“Skybox”(将显示为Skybox)。

Pass

Pass命名以及Subshader中调用Pass

语法:

Name "PassName" 

PassName必须为全大写字母

在Subshader中调用Pass:

UsePass "Shader/Name"

举例:

UsePass "VertexLit/SHADOWCASTER"

剔除/ZWrite/Ztest

Cull Back | Front | Off
ZWrite On | Off
ZTest Less | Greater | LEqual | GEqual | Equal | NotEqual | Always

ZTest可设置的测试规则:
ZTest Less:深度小于当前缓存则通过
ZTest Greater:深度大于当前缓存则通过
ZTest LEqual:深度小于等于当前缓存则通过
ZTest GEqual:深度大于等于当前缓存则通过
ZTest Equal:深度等于当前缓存则通过
ZTest NotEqual:深度不等于当前缓存则通过
ZTest Always:不论如何都通过
注意,ZTest Off等同于ZTest Always,关闭深度测试等于完全通过。
————————————————
版权声明:本文为CSDN博主「O213」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013477973/article/details/80617787

默认值为LEqual

Offset Factor, Units

查了一下好像是用来解决两个位置相同的片在显示上出现混乱的情况,暂时没用到,用到再研究:
Unity Shader - Offset 的测试,解决简单的z-fighting情况
unity shader Offset Factor, Units详解

混合

Blend SrcAlpha OneMinusSrcAlpha // Traditional transparency 最常用的半透明混合模式
Blend One OneMinusSrcAlpha // Premultiplied transparency 
Blend One One // Additive
Blend OneMinusDstColor One // Soft Additive
Blend DstColor Zero // Multiplicative
Blend DstColor SrcColor // 2x Multiplicative

混合模式详解以及Alpha混合模式抗锯齿等内容见官方文档:https://docs.unity3d.com/Manual/SL-Blend.html

Pass标签

语法:

Tags { "TagName1" = "Value1" "TagName2" = "Value2" }

LightMode标签

Always:始终渲染;没有照明。(应该就是无光模式)
ForwardBase:应用于前向渲染;“AO”,“主要定向光”,“顶点/ SH 光照”和“ 光照贴图”被应用。
ForwardAdd:应用于前向渲染;添加逐像素光,每个灯光渲染一次拥有该标签的pass。
Deferred:应用于延迟渲染;渲染g-buffer。
ShadowCaster:将对象深度渲染到阴影贴图或深度纹理中。
MotionVectors:用于计算每个对象的运动矢量。
PrepassBase:在旧版Deferred Lighting中使用,渲染法线和specular exponent。
PrepassFinal:在旧版Deferred Lighting中使用,通过合并贴图、光照、自发光来渲染最终颜色。
Vertex:当对象未设置光照时,用于旧版Vertex Lit渲染;所有顶点光都被应用。
VertexLMRGBM:当对象被lightmapped时(不知道啥意思),用于传统的Vertex Lit渲染;在光照贴图是RGBM编码的平台上(PC和控制台)。
VertexLM:当对象被lightmapped时,用于传统的Vertex Lit渲染;在光照贴图是双LDR编码的平台上(移动平台)。

PassFlags标签

OnlyDirectional:在ForwardBase类型的pass中使用时,使用此标志可以使其仅将主定向光照和AO/光照探针数据传递到着色器中。这意味着不重要的光的数据不会传递到顶点光或球谐函数着色器变量中。

RequireOptions标签:
SoftVegetation:仅当“ 质量”窗口中的“软植被”处于启用状态时,才渲染此通道。

模板(Stencil)

内容太多直接上官方文档https://docs.unity3d.com/Manual/SL-Stencil.html

GrabPass

在Subshader中使用;
可以使用

GrabPass{}

可以将当前屏幕内容抓取到一个纹理中,该纹理可以通过_GrabTexture这个名字访问。但是注意!这种抓取形式将对使用它的每个对象执行耗时的屏幕抓取操作。

也可以使用

GrabPass { "TextureName" } 

这种方法,但是这样每帧会为使用这种方法的第一个对象执行一次屏幕抓取操作。该纹理可以在后面的Pass中使用给定的TextureName访问,这种方法更有效率。

此外,GrabPass也可以使用Pass命名和Tags命令

用法示例:

Shader "GrabPassInvert"
{
    SubShader
    {
        // Draw ourselves after all opaque geometry
        Tags { "Queue" = "Transparent" }

        // Grab the screen behind the object into _BackgroundTexture
        GrabPass
        {
            "_BackgroundTexture"
        }

        // Render the object with the texture generated above, and invert the colors
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f
            {
                float4 grabPos : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert(appdata_base v) {
                v2f o;
                // use UnityObjectToClipPos from UnityCG.cginc to calculate 
                // the clip-space of the vertex
                o.pos = UnityObjectToClipPos(v.vertex);
                // use ComputeGrabScreenPos function from UnityCG.cginc
                // to get the correct texture coordinate
                o.grabPos = ComputeGrabScreenPos(o.pos);
                return o;
            }

            sampler2D _BackgroundTexture;

            half4 frag(v2f i) : SV_Target
            {
                half4 bgcolor = tex2Dproj(_BackgroundTexture, i.grabPos);
                return 1 - bgcolor;
            }
            ENDCG
        }

    }
}

此着色器中有两个Pass:第一遍获取渲染时对象背后的任何东西,然后在第二遍中应用它。注意,使用反向混合模式(invert blend mode)可以更有效地实现相同的效果。

Fallback

语法:

Fallback "name"

或者明确指出不使用Fallback:

Fallback Off

举例:

Shader "example" {
    // properties and subshaders here...
    Fallback "otherexample"
}

CustomEditor

可以为您的着色器定义CustomEditor 。当您执行此操作时,Unity将寻找一个使用该名称扩展ShaderGUI的类。如果找到一个使用此着色器的材质,则将使用此ShaderGUI。有关示例,请参见Custom Shader GUI

语法:

  CustomEditor "name"

使用具有给定名称的ShaderGUI 。

例:

Shader "example" {
	// properties and subshaders here...
	CustomEditor "MyCustomEditor"
}

CustomEditor语句会影响所有使用此着色器的材质
另附:【Unity Shader】自定义材质面板的小技巧

其他命令

Category

可以批量设置多个Subshader的渲染状态,比如给每个Subshader设置关闭雾效和混合模式:

Shader "example" {
Category {
    Fog { Mode Off }
    Blend One One
    SubShader {
        // ...
    }
    SubShader {
        // ...
    }
    // ...
}
}

该方法就是图一方便,不会提升任何效率,和手动挨个设置在效率上没区别。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值