unity shader学习笔记2
HLSL语言基础
官网文档https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl
语言语法
https://docs.microsoft.com/zh-cn/windows/win32/direct3dhlsl/dx-graphics-hlsl-language-syntax
变量
数据类型
包括标量,向量,矩阵,数组,结构体,着色器,纹理等数据类型
标量
和c/c++差不多.
bool-正确或错误。
int -32位有符号整数。
uint -32位无符号整数。
dword -32位无符号整数。
half -16位浮点值。仅出于语言兼容性提供此数据类型。Direct3D 10着色器目标将所有一半的数据类型映射为浮点数据类型。半数据类型不能用于统一的全局变量(如果需要此功能,请使用/ Gec标志)。
float -32位浮点值。
double -64位浮点值。您不能将双精度值用作流的输入和输出。通过着色器之间的双精度值,声明每个双作为对UINT数据类型。然后,使用asuint函数给每个信息包双入对UINT S和asdouble函数解压对UINT背部到双。
fixed4 低精度 RGBA 颜色
向量
声明方法一般有两种
bool bVector; // scalar containing 1 Boolean
int1 iVector = 1;
float3 fVector = { 0.2f, 0.3f, 0.4f };
vector <Type, Number> VariableName
vector <int, 1> iVector = 1;
vector <double, 4> dVector = { 0.2, 0.3, 0.4, 0.5 };
矩阵
以标量类型+行X列的方式声明
int1x1 iMatrix; // integer matrix with 1 row, 1 column
int4x1 iMatrix; // integer matrix with 4 rows, 1 column
int1x4 iMatrix; // integer matrix with 1 row, 4 columns
double3x3 dMatrix; // double matrix with 3 rows, 3 columns
float2x2 fMatrix = { 0.0f, 0.1, // row 1
2.1f, 2.2f // row 2
};
matrix <float, 2, 2> fMatrix = { 0.0f, 0.1, // row 1
2.1f, 2.2f // row 2
};
访问方法
向量:
The position set: x,y,z,w
The color set: r,g,b,a
float4 pos = float4(0,0,2,1);
pos.z // value is 2
可以读取一个或多个分量
float4 pos = float4(0,0,2,1);
float2 f_2D;
f_2D = pos.xy; // read two components
f_2D = pos.xz; // read components in any order
f_2D = pos.zx;
f_2D = pos.xx; // components can be read more than once
f_2D = pos.yy;
pos.b // value is 2
矩阵:
矩阵包含按行和列组织的值,可以使用结构运算符“”进行访问。随后是两个命名集之一:
从零开始的行列位置:
_m00,_m01,_m02,_m03
_m10,_m11,_m12,_m13
_m20,_m21,_m22,_m23
_m30,_m31,_m32,_m33
基于一个的行列位置:
_11,_12,_13,_14
_21,_22,_23,_24
_31,_32,_33,_34
_41,_42,_43,_44
// given
float2x2 fMatrix = { 1.0f, 1.1f, // row 1
2.0f, 2.1f // row 2
};
float f_1D;
f_1D = matrix._m00; // read the value in row 1, column 1: 1.0
f_1D = matrix._m11; // read the value in row 2, column 2: 2.1
f_1D = matrix._11; // read the value in row 1, column 1: 1.0
f_1D = matrix._22; // read the value in row 2, column 2: 2.1
数组方式进行访问:
float2x2 fMatrix = { 1.0f, 1.1f, // row 1
2.0f, 2.1f // row 2
};
float temp;
temp = fMatrix[0][0] // single component read
temp = fMatrix[0][1] // single component read