14.CG语句写在哪里

  1. 14.CG-CG语句写在哪里
    1. 14.1 知识点
      1. CG语句写在哪里
      2. 重要的编译指令 —— 指定着色器函数
    2. 14.2 知识点代码
      1. Lesson14_CG_CG语句写在哪里
      2. Lesson14_NewUnlitShader.shader

14.CG-CG语句写在哪里


14.1 知识点

CG语句写在哪里

对于顶点\片元着色器来说,CG语句需要写在Pass渲染通道语句块中。我们需要在Pass语句块中加入指令 CGPROGRAMENDCG。在这两个指令之间就是我们书写CG代码的地方。

Pass
{
    CGPROGRAM
    // CG代码写在这里
    ENDCG
}

重要的编译指令 —— 指定着色器函数

在真正书写CG代码之前,我们需要先使用 #pragma 声明编译指令。我们目前只学习指定顶点\片元着色器函数的编译指令,其他相关编译指令我们以后再学习。

定义实现顶点/片元着色器代码的函数名称:

#pragma vertex name(实现顶点着色器的函数名)
#pragma fragment name(实现片元着色器的函数名)

这两个编译指令的作用是将顶点\片元着色器实现定位到两个函数中。之后我们只需要在这两个函数中书写Shader逻辑即可。

Pass
{
    CGPROGRAM
    // 开始一个 CG 程序块

    #pragma vertex vert // 使用 vert 函数作为顶点着色器
    #pragma fragment frag // 使用 frag 函数作为片段着色器
    
    // make fog work
    #pragma multi_compile_fog // 在多个雾效选项之间进行编译

    #include "UnityCG.cginc" // 包含 UnityCG.cginc 文件,其中定义了一些 Unity 的常用函数和宏

    // 定义输入结构体 appdata,包含顶点位置和纹理坐标
    struct appdata
    {
        float4 vertex : POSITION; // 顶点位置
        float2 uv : TEXCOORD0; // 纹理坐标
    };

    // 定义输出结构体 v2f,包含纹理坐标和裁剪空间坐标
    struct v2f
    {
        float2 uv : TEXCOORD0; // 纹理坐标
        UNITY_FOG_COORDS(1) // 雾效坐标,用于雾效计算
        float4 vertex : SV_POSITION; // 裁剪空间坐标
    };

    sampler2D _MainTex; // 主纹理采样器
    float4 _MainTex_ST; // 主纹理的纹理坐标变换矩阵

    
    // 定义顶点着色器函数 vert,参数为输入结构体 appdata
    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; // 返回输出结构体
    }

    
    // 定义片段着色器函数 frag,参数为输出结构体 v2f
    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 // 结束 CG 程序块
}

注意以下代码,定义实现时使用 vert 函数作为顶点着色器和使用 frag 函数作为片元着色器。

Pass
{
    CGPROGRAM
    #pragma vertex vert // 使用 vert 函数作为顶点着色器
    #pragma fragment frag // 使用 frag 函数作为片段着色器
    
    //...

    // 定义顶点着色器函数 vert,参数为输入结构体 appdata
    v2f vert(appdata v)
    {
        v2f o; // 输出结构体
        //...
        return o; // 返回输出结构体
    }

    
    // 定义片段着色器函数 frag,参数为输出结构体 v2f
    fixed4 frag(v2f i) : SV_Target
    {
        fixed4 col = tex2D(_MainTex, i.uv); // 采样主纹理
        //...
        return col; // 返回颜色
    }
    
    ENDCG
}

14.2 知识点代码

Lesson14_CG_CG语句写在哪里

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

public class Lesson14_CG_CG语句写在哪里 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 CG语句写在哪里?

        //对于顶点\片元着色器来说
        //CG语句需要写在Pass渲染通道语句块中
        //我们需要在Pass语句块中
        //加入指令
        //CGPROGRAM

        //在这两个指令之间 就是我们书写CG代码的地方

        //ENDCG

        #endregion

        #region 知识点二 重要的编译指令 —— 指定着色器函数

        //在真正书写CG代码之前
        //我们需要先使用 #pragma 声明编译指令
        //我们目前只学习 指定顶点\片元着色器函数的 编译指令
        //其他相关编译指令我们以后再学习

        //定义实现 顶点/片元着色器 代码的函数名称
        //#pragma vertex name(实现顶点着色器的函数名)
        //#pragma fragment name(实现片元着色器的函数名)

        //这两个编译指令的作用是将顶点\片元着色器实现定位到两个函数中
        //之后我们只需要在这两个函数中书写Shader逻辑即可

        #endregion
    }
}

Lesson14_NewUnlitShader.shader

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

        Pass
        {
            CGPROGRAM
            // 开始一个 CG 程序块

            #pragma vertex vert // 使用 vert 函数作为顶点着色器
            #pragma fragment frag // 使用 frag 函数作为片段着色器
            
            // make fog work
            #pragma multi_compile_fog // 在多个雾效选项之间进行编译

            #include "UnityCG.cginc" // 包含 UnityCG.cginc 文件,其中定义了一些 Unity 的常用函数和宏

            // 定义输入结构体 appdata,包含顶点位置和纹理坐标
            struct appdata
            {
                float4 vertex : POSITION; // 顶点位置
                float2 uv : TEXCOORD0; // 纹理坐标
            };

            // 定义输出结构体 v2f,包含纹理坐标和裁剪空间坐标
            struct v2f
            {
                float2 uv : TEXCOORD0; // 纹理坐标
                UNITY_FOG_COORDS(1) // 雾效坐标,用于雾效计算
                float4 vertex : SV_POSITION; // 裁剪空间坐标
            };

            sampler2D _MainTex; // 主纹理采样器
            float4 _MainTex_ST; // 主纹理的纹理坐标变换矩阵

            
            // 定义顶点着色器函数 vert,参数为输入结构体 appdata
            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; // 返回输出结构体
            }

            
            // 定义片段着色器函数 frag,参数为输出结构体 v2f
            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 // 结束 CG 程序块
        }

    }
}


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

×

喜欢就点赞,疼爱就打赏