15.CG-基础数据类型
15.1 知识点
基础数据类型
CG中的基础数据类型和C#中基本一致。重要区别是:
- 多了几种浮点数类型 half 和 fixed。
- 多了纹理类型 sampler。
- 数组的声明有些许区别。
- 基础数据类型有:
- 整形
- 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