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
posted @ 2021-03-12 10:49  melt00  阅读(133)  评论(0编辑  收藏  举报