11.顶点片元着色器

11.ShaderLab-Shader编写形式-顶点片元着色器


11.1 知识点

知识回顾

  • 表面着色器是Unity对顶点/片元着色器的封装,可以用更少的代码实现复杂的逻辑,但是性能和可控性较差。它的特点是:

    • 直接在SubShader语句块中书写着色器逻辑。
    • 我们不需要关心也不需要使用多个Pass,每个Pass如何渲染,Unity会在内部帮助我们去处理。
    • 可以使用CG或HLSL两种Shader语言去编写Shader逻辑。
    • 代码量较少,可控性较低,性能消耗较高。
    • 适用于处理需要和各种光源打交道的着色器,但是在移动平台上需要注意性能表现。

顶点/片元着色器

  • 我们可以在创建Shader时,选择创建Unlit Shader来快速创建顶点/片元着色器模板。
  • 如下是默认的顶点/片元着色器。
Shader "ShaderTeach/Lesson11_NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}
  • 通过观察,我们发现顶点/片元着色器的着色器代码是编写在Pass语句块中,我们需要自己定义每个Pass需要使用的Shader代码。

  • 虽然比起表面着色器来说我们需要编写的代码较多,但是好处是灵活性更高,可控性更强,可以控制更多的渲染细节,决定对性能影响的高低。

  • 总结顶点/片元着色器的特点是:

    • 需要在Pass渲染通道中编写着色器逻辑。
    • 可以使用CG或HLSL两种Shader语言去编写Shader逻辑。
    • 代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节。
    • 适用于光照处理较少,自定义渲染效果较多时(移动平台首选)。

11.2 知识点代码

Lesson11_ShaderLab_Shader编写形式_顶点片元着色器

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Lesson11_ShaderLab_Shader编写形式_顶点片元着色器 : MonoBehaviour
{
    void Start()
    {
        #region 知识回顾

        //表面着色器是Unity对顶点/片元着色器的封装
        //可以用更少的代码实现复杂的逻辑
        //但是性能和可控性较差
        //它的特点是
        //1.直接在SubShader语句块中书写着色器逻辑
        //2.我们不需要关心也不需要使用多个Pass,每个Pass如何渲染,Unity会在内部帮助我们去处理
        //3.可以使用CG或HLSL两种Shader语言去编写Shader逻辑
        //4.代码量较少,可控性较低,性能消耗较高
        //5.适用于处理需要和各种光源打交道的着色器,但是在移动平台上需要注意性能表现

        #endregion

        #region 知识点 顶点/片元着色器

        //我们可以在创建Shader时,选择创建Unlit Shader来快速创建顶点/片元着色器模板
        //通过观察,我们发现
        //顶点/片元着色器的着色器代码是编写在Pass语句块中
        //我们需要自己定义每个Pass需要使用的Shader代码
        //虽然比起表面着色器来说我们需要编写的代码较多
        //但是好处是灵活性更高,可控性更强,可以控制更多的渲染细节
        //决定对性能影响的高低

        //它的特点是
        //1.需要在Pass渲染通道中编写着色器逻辑
        //2.可以使用CG或HLSL两种Shader语言去编写Shader逻辑
        //3.代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节
        //4.适用于光照处理较少,自定义渲染效果较多时(移动平台首选)

        #endregion
    }
}

Lesson11_NewUnlitShader.shader

Shader "ShaderTeach/Lesson11_NewUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏