15.CG语法基础数据类型

15.CG-基础数据类型


15.1 知识点

基础数据类型

CG中的基础数据类型和C#中基本一致。重要区别是:

  1. 多了几种浮点数类型 half 和 fixed。
  2. 多了纹理类型 sampler。
  3. 数组的声明有些许区别。
  • 基础数据类型有:
    • 整形
      • uint 32为无符号整形
      • int 32位整形
    • 浮点形
      • float 32位浮点数 符号:f
      • half 16位浮点数 符号:h
      • fixed 12位浮点数
    • 特殊类型
      • bool 布尔类型
      • string 字符串
    • sampler 纹理对象句柄
      • sampler: 通用的纹理采样器,可以用于处理各种不同维度和类型的纹理
      • sampler1D: 用于一维纹理,通常用于对一维纹理进行采样,例如从左到右的渐变色
      • sampler2D: 用于二维纹理,最常见的纹理类型之一。它用于处理二维图像纹理,例如- 贴图
      • sampler3D: 用于三维纹理,通常用于体积纹理,例如体积渲染
      • samplerCUBE: 用于立方体纹理,通常用于处理环境映射等需要立方体贴图的情况
      • samplerRECT: 用于处理矩形纹理,通常用于一些非标准的纹理映射需求
      • 他们都是用于处理纹理(Texture)数据的数据类型
      • 他们的主要区别是纹理的维度和类型
v2f vert(appdata v)
{
    v2f o;

    // 声明各种基础数据类型的变量作为示例
    
    // uint 32位无符号整形
    uint myUint = 10u;
    
    // int 32位整形
    int myInt = -10;
    
    // float 32位浮点数,符号:f
    float myFloat = 10.0f;
    
    // half 16位浮点数,符号:h
    half myHalf = 5.5h;
    
    // fixed 12位浮点数
    fixed myFixed = 0.5;
    
    // bool 布尔类型
    bool myBool = true;
    
    // string 字符串(在Shader中很少使用,一般在高层语言中使用)
    // 注:在HLSL/Cg中不直接支持string类型,这里只是作为示例。
    // string myString = "example"; // 不被支持
    
    // 声明各种纹理采样器变量作为示例
    
    // sampler 通用的纹理采样器
    sampler mySampler;
    
    // sampler1D 用于一维纹理
    sampler1D mySampler1D;
    
    // sampler2D 用于二维纹理
    sampler2D mySampler2D;
    
    // sampler3D 用于三维纹理
    sampler3D mySampler3D;
    
    // samplerCUBE 用于立方体纹理
    samplerCUBE mySamplerCUBE;
    
    // samplerRECT 用于矩形纹理
    sampler2D mySamplerRECT;
    
    return o;
}

基础复合数据类型

  • 数组:和C#中类似

    • 一维
      int a[4] = {1,2,3,4};
      // CG语法无法通过Length获取数组长度 要手动用变量记录 之后使用该变量遍历
      int aLength = 4;
      
    • 二维
      int b[2][3] = {{1,2,3},{4,5,6}};
      // CG语法无法通过Length获取数组长度 要手动用变量记录
      int bRowsLength = 2;
      int bColsLength = 3;
      
    • 遍历
      // 遍历一维数组的示例
      for (int i = 0; i < aLength; i++)
      {
          int value = a[i]; // 访问数组元素
          // 可以在这里对 value 做进一步处理
      }
      
      // 遍历二维数组的示例
      for (int row = 0; row < bRowsLength; row++)
      {
          for (int col = 0; col < bColsLength; col++)
          {
              int value = b[row][col]; // 访问二维数组元素
              // 可以在这里对 value 做进一步处理
          }
      }
      
  • 结构体

    • 和C#基本一样

    • 没有访问修饰符

    • 结构体声明结束加分号

    • 一般在函数外声明

      // 声明结构体作为示例
      struct MyStruct
      {
          float myFloat; // 浮点数成员
          int myInt; // 整型成员
          bool myBool; // 布尔型成员
      };
      
      
      v2f vert(appdata v)
      {
          v2f o;
      
          // 声明并初始化结构体变量
          MyStruct example;
          example.myFloat = 1.0f;
          example.myInt = 42;
          example.myBool = true;
      
          // 使用结构体成员
          float someValue = example.myFloat * example.myInt;
          if (example.myBool)
          {
              // 做一些操作
          }
      
      
          return o;
      }
      

总结

  • CG中的基础数据类型和C#中基本一致,但有一些重要区别,如多了几种浮点数类型、纹理类型 sampler 以及数组声明有些许区别。

15.2 知识点代码

Lesson15_CG_基础数据类型

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

public class Lesson15_CG_基础数据类型 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 基础数据类型

        //uint      32为无符号整形
        //int       32位整形

        //float     32位浮点数 符号:f
        //half      16位浮点数 符号:h
        //fixed     12位浮点数 

        //bool      布尔类型
        //string    字符串

        //sampler 纹理对象句柄
        //  sampler:     通用的纹理采样器,可以用于处理各种不同维度和类型的纹理
        //  sampler1D:   用于一维纹理,通常用于对一维纹理进行采样,例如从左到右的渐变色
        //  sampler2D:   用于二维纹理,最常见的纹理类型之一。它用于处理二维图像纹理,例如贴图
        //  sampler3D:   用于三维纹理,通常用于体积纹理,例如体积渲染
        //  samplerCUBE: 用于立方体纹理,通常用于处理环境映射等需要立方体贴图的情况
        //  samplerRECT: 用于处理矩形纹理,通常用于一些非标准的纹理映射需求
        //  他们都是用于处理纹理(Texture)数据的数据类型
        //  他们的主要区别是纹理的维度和类型

        #endregion

        #region 知识点二 基础复合数据类型

        //数组:和C#中类似
        //一维
        //int a[4] = {1,2,3,4}
        //CG语法无法通过Length获取数组长度 要手动用变量记录 之后使用该变量遍历
        //int aLength = 4

        //二维
        //int b[2][3] = {{1,2,3},{4,5,6}}
        //CG语法无法通过Length获取数组长度 要手动用变量记录
        //int bRowsLength = 2
        //int bColsLength = 3

        //结构体
        //和C#基本一样
        //没有访问修饰符
        //结构体声明结束加分号
        //一般在函数外声明

        #endregion

        #region 总结

        //CG中的基础数据类型和C#中基本一致
        //重要区别是
        //1.多了几种浮点数类型 half和fixed
        //2.多了纹理类型 sampler
        //3.数组的声明有些许区别

        #endregion
    }
}

Lesson15_NewUnlitShader.shader

Shader "ShaderTeach/Lesson15_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;

            // 声明结构体作为示例
            struct MyStruct
            {
                float myFloat; // 浮点数成员
                int myInt; // 整型成员
                bool myBool; // 布尔型成员
            };


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

                // 声明各种基础数据类型的变量作为示例

                // uint 32位无符号整形
                uint myUint = 10u;

                // int 32位整形
                int myInt = -10;

                // float 32位浮点数,符号:f
                float myFloat = 10.0f;

                // half 16位浮点数,符号:h
                half myHalf = 5.5h;

                // fixed 12位浮点数
                fixed myFixed = 0.5;

                // bool 布尔类型
                bool myBool = true;

                // string 字符串(在Shader中很少使用,一般在高层语言中使用)
                // 注:在HLSL/Cg中不直接支持string类型,这里只是作为示例。
                // string myString = "example"; // 不被支持

                // 声明各种纹理采样器变量作为示例

                // sampler 通用的纹理采样器
                sampler mySampler;

                // sampler1D 用于一维纹理
                sampler1D mySampler1D;

                // sampler2D 用于二维纹理
                sampler2D mySampler2D;

                // sampler3D 用于三维纹理
                sampler3D mySampler3D;

                // samplerCUBE 用于立方体纹理
                samplerCUBE mySamplerCUBE;

                // samplerRECT 用于矩形纹理
                sampler2D mySamplerRECT;


                // 声明数组变量作为示例

                // 一维数组
                int a[4] = {1, 2, 3, 4}; // 声明并初始化一维数组
                int aLength = 4; // 手动记录一维数组长度

                // 二维数组
                int b[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 声明并初始化二维数组
                int bRowsLength = 2; // 手动记录二维数组行数
                int bColsLength = 3; // 手动记录二维数组列数

                // 遍历一维数组的示例
                for (int i = 0; i < aLength; i++)
                {
                    int value = a[i]; // 访问数组元素
                    // 可以在这里对 value 做进一步处理
                }

                // 遍历二维数组的示例
                for (int row = 0; row < bRowsLength; row++)
                {
                    for (int col = 0; col < bColsLength; col++)
                    {
                        int value = b[row][col]; // 访问二维数组元素
                        // 可以在这里对 value 做进一步处理
                    }
                }


                // 声明并初始化结构体变量
                MyStruct example;
                example.myFloat = 1.0f;
                example.myInt = 42;
                example.myBool = true;

                // 使用结构体成员
                float someValue = example.myFloat * example.myInt;
                if (example.myBool)
                {
                    // 做一些操作
                }


                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
        }
    }
}

15.3 练习题

请说出CG语法中sampler2D、half、fixed分别代表什么类型?

  • sampler2D: 二维纹理,最常见的纹理类型之一。它用于处理二维图像纹理,例如贴图
  • half: 16位浮点数 符号:h
  • fixed: 12位浮点数

在CG语法中如何声明一维、二维数组?请通过代码举例说明

一维数组:

int a[4] = {1,2,3,4};

二维数组:

int b[2][3] = {{1,2,3},{4,5,6}};


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

×

喜欢就点赞,疼爱就打赏