【Unity Shader】自定义顶点片元着色器解析

案例

Shader "Unlit/shader01"
{
    Properties
    {
		_MyColor("color", Color) = (1,1,1,1)

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

			fixed4 _MyColor;

            v2f vert (appdata v)
            {
                v2f o;
                //o.vertex = UnityObjectToClipPos(v.vertex);
				//o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return _MyColor;
            }
            ENDCG
        }
    }
}

1. Properties

对应编辑器里面可以编辑的属性值,需要在shader里面以及在Properties里面声明,如上面的_MyColor,除了color类型还可以使用别的类型

2. SubShader

一个Shader中可以有多个SubShader,但只执行第一个可执行的SubShader。

2.1 Tags

Tags语法格式如下:
Tags { “TagName1” = “Value1” “TagName2” = “Value2” }
这里重要注意:这种Tag有两种,一种是SubShader Tags,一种是Pass Tags, 也就是说Pass中Tags会覆盖SubShader里面的Tags,也可以Pass中不定义,直接使用SubShader里面的Tags,是一个继承关系

可参考 tags

2.1.1 Queue

表示该物体渲染顺序,如透明物体属于Transparent队列,非透明物体属于Geometry队列,这里就是Geometry队列先进行渲染
【Unity Shader】自定义顶点片元着色器解析_第1张图片
如透明物体的话就是用 Tags { "Queue" = "Transparent" }
这里注意还可以使用运算符 Tags { "Queue" = "Transparent+10" } ,表示这个material的渲染顺序是3010

脚本中可以设置该值如 material.renderQueue=具体数值

2.1.2 RenderType

【Unity Shader】自定义顶点片元着色器解析_第2张图片

如透明物体的话就是用 Tags { "RenderType"="Transparent" }
暂时没用到,可不用,么感觉有啥用处
参考 https://blog.csdn.net/wpapa/article/details/51319434

2.2 LOD

设置该值后,如LOD 100
着色器会找到第一个<= Shader.maximumLOD 这个subShader执行,设置方式为shader.maximumLOD = 300;

2.3 Pass

SubShader里面包换的基本的Pass命令包含渲染状态设置命令的列表。

在Shader的使用中会发现有时候只进行一次渲染是不够的,还要在它的基础上在加上一次或者多次才行,这就是多Pass的渲染的由来,如后处理的使用,就是基于这个

这里重要注意:Pass里面被定义的语句在SubShader也可以被定义(要不然代码会巨长无比,也会有很多重复的部分)

3. Fallback

在所有SubShader的后面可定义 Fallback。基本上就是说,如果没有任何子着色器能够在此硬件上运行,则尝试使用另一个着色器中的子着色器

如使用一个备选shader
Fallback "name"
或者直接关闭
Fallback Off

你可能感兴趣的:(Unity3D,unity,着色器,游戏引擎)