16.CG语法特殊数据类型

16.CG-特殊数据类型


16.1 知识点

向量

向量类型属于CG语言的内置数据类型。内置的向量类型是基于基础数据类型声明的。向量的最大维度不超过4维,数据类型可以是任意数值类型。

基本构成如下:

  • 数据类型2 = 数据类型2(n1,n2)
  • 数据类型3 = 数据类型3(n1,n2,n3)
  • 数据类型4 = 数据类型4(n1,n2,n3,n4)
fixed4 frag(v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);


    // 向量类型示例
    // float2 类型示例
    float2 vec2 = float2(1.0, 2.0);
    
    // fixed3 类型示例
    fixed3 vec3 = fixed3(1.0, 2.0, 3.0);

    // int4 类型示例
    int4 vec4 = int4(1, 2, 3, 4);


    return col;
}

矩阵

矩阵类型属于CG语言的内置数据类型。矩阵的最大行列不大于4,不小于1,数据类型可以是任意数值类型。

基本构成如下:

  • 数据类型’n’x’m’ = {n1m1,n1m2,n1m3…..}

  • 注意,矩阵写的时候最好手动换行增加可读性

fixed4 frag(v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);


    // 矩阵类型示例
    // half2x2 矩阵示例
    half2x2 mat2x2 = half2x2(1.0h, 2.0h, 
                             3.0h, 4.0h);

    // fixed3x3 矩阵示例
    fixed3x3 mat3x3 = fixed3x3(1.0, 2.0, 3.0,
                               4.0, 5.0, 6.0, 
                               7.0, 8.0, 9.0);

    // int4x4 矩阵示例
    int4x4 mat4x4 = int4x4(1, 2, 3, 4,
                           5, 6, 7, 8, 
                           9, 10, 11, 12,
                           13, 14, 15, 16);


    return col;
}

bool类型特殊使用

bool类型同样可以用于如同向量一样声明。它可以用于存储一些逻辑判断结果。

fixed4 frag(v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);


    // bool 类型特殊使用示例
    half3 a = half3(0.5h, 0.0h, 1.0h);
    half3 b = half3(0.6h, -0.1h, 0.9h);
    bool3 c = a < b; 
    // 结果为 bool3(true, false, false) 用ab两个向量的对应值比较


    return col;
}

总结

  1. 向量最大维度不超过4维。
  2. 矩阵最大行列不大于4,不小于1,在赋值时一定注意行列的关系。
  3. bool向量可以用来存储向量之间比较的结果。

注意:CG中向量、矩阵和数组是完全不同的,向量和矩阵是内置的数据类型,而数组则是一种数据结构,不是内置数据类型。


16.2 知识点代码

Lesson16_CG_特殊数据类型

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

public class Lesson16_CG_特殊数据类型 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 向量

        //向量类型属于CG语言的内置数据类型

        //内置的向量类型是基于基础数据类型声明的
        //向量的最大维度不超过4维
        //数据类型可以是任意数值类型
        //基本构成
        //数据类型2 = 数据类型2(n1,n2)
        //数据类型3 = 数据类型3(n1,n2,n3)
        //数据类型4 = 数据类型4(n1,n2,n3,n4)

        #endregion

        #region 知识点二 矩阵

        //矩阵类型属于CG语言的内置数据类型

        //矩阵的最大行列不大于4,不小于1
        //数据类型可以是任意数值类型
        //基本构成
        //数据类型'n'x'm' = {n1m1,n1m2,n1m3.....}
        //数据类型2x2
        //数据类型3x3
        //数据类型4x4

        #endregion

        #region 知识点三 bool类型特殊使用

        //bool类型同样可以用于如同向量一样声明
        //它可以用于存储一些逻辑判断结果
        //比如
        //float3 a = float3(0.5, 0.0, 1.0);
        //float3 b = float3(0.6, -0.1, 0.9);
        //bool3 c = a < b;
        //运算后向量c的结果为bool3(true, false, false)

        #endregion

        #region 总结

        //1.向量最大维度不超过4维
        //2.矩阵最大行列不大于4,不小于1,在赋值时一定注意行列的关系
        //3.bool向量可以用来存储向量之间比较的结果

        //注意:CG中向量,矩阵和数组是完全不同的,向量和矩阵是内置的数据类型,而数组则是一种数据结构,不是内置数据类型

        #endregion
    }
}

Lesson16_NewUnlitShader.shader

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


                // 向量类型示例
                // float2 类型示例
                float2 vec2 = float2(1.0, 2.0);
                
                // fixed3 类型示例
                fixed3 vec3 = fixed3(1.0, 2.0, 3.0);

                // int4 类型示例
                int4 vec4 = int4(1, 2, 3, 4);

                // 矩阵类型示例
                // half2x2 矩阵示例
                half2x2 mat2x2 = half2x2(1.0h, 2.0h, 3.0h, 4.0h);

                // fixed3x3 矩阵示例
                fixed3x3 mat3x3 = fixed3x3(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0);

                // int4x4 矩阵示例
                int4x4 mat4x4 = int4x4(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16);

                // bool 类型特殊使用示例
                half3 a = half3(0.5h, 0.0h, 1.0h);
                half3 b = half3(0.6h, -0.1h, 0.9h);
                bool3 c = a < b; // 结果为 bool3(true, false, false)


                return col;
            }
            ENDCG
        }
    }
}

16.3 练习题

请用CG语法声明一个任意类型的4维向量

float4 vec4 = float4(1.0, 2.0, 3.0, 4.0);

请用CG语法声明一个任意类型的4x4矩阵

fixed4x4 m4x4 = {
    1, 2, 3, 4,
    4, 5, 6, 7,
    7, 8, 9, 10,
    11, 12, 13, 14
};


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

×

喜欢就点赞,疼爱就打赏