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;
}
总结
- 向量最大维度不超过4维。
- 矩阵最大行列不大于4,不小于1,在赋值时一定注意行列的关系。
- 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