网络安全检测|网络安全服务|网络安全扫描-香港墨客投资移动版

主页 > 业界资讯 > 网络渗透测试

DirectX11--HLSL语法入门

编写本内容仅仅是为了完善当前的教程体系,入门级别的内容其实基本上都是千篇一概,仅有一些必要细节上的扩充。要入门HLSL,只是掌握入门语法,即使把HLSL的所有语法也吃透了也并不表明你就能着色器代码了,还须要结合到渲染管线中,随着教程的不断深刻来不断学习须要用到的新的语法,而后尝试修改着色器,再根据实际需求本身编写着色器来实现特定的效果。html

注意:在翻阅HLSL文档的时候,要避开Effects11相关的内容。由于当前教程与Effects11是不兼容的。git

DirectX11 With Windows SDK完整目录github

Github项目源码数组

欢迎加入QQ群: 727623616 能够一块儿探讨DX11,以及有什么问题也能够在这里汇报。函数

数据类型 标量

经常使用标量类型以下:oop

类型 描述
bool   32位整数值用于存放逻辑值true和false  
int   32位有符号整数  
uint   32位无符号整数  
half   16位浮点数(仅提供用于向后兼容)  
float   32位浮点数  
double   64位浮点数  

注意:一些平台可能不支持int, half和double,若是出现这些状况将会使用float来模拟布局

此外,浮点数还有规格化的形式:性能

snorm float是IEEE 32位有符号且规格化的浮点数,表示范围为-1到1

unorm float是IEEE 32位无符号且规格化的浮点数,表示范围为0到1

向量

向量类型能够支持2到4个同类元素学习

一种表示方式是使用相似模板的形式来描述测试

vector<float, 4> vec1; // 向量vec1包含4个float元素 vector<int, 2> vec2; // 向量vec2包含2个int元素

另外一种方式则是直接在基本类型后面加上数字

float4 vec1; // 向量vec1包含4个float元素 int3 vec2; // 向量vec2包含3个int元素

固然,只使用vector自己则表示为一种包含4个float元素的类型

vector vec1; // 向量vec1包含4个float元素

向量类型有以下初始化方式:

float2 vec0 = {0.0f, 1.0f}; float3 vec1 = float3(0.0f, 0.1f, 0.2f); float4 vec2 = float4(vec1, 1.0f);

向量的第1到第4个元素既能够用x, y, z, w来表示,也能够用r, g, b, a来表示。除此以外,还能够用索引的方式来访问。下面展现了向量的取值和访问方式:

float4 vec0 = {1.0f, 2.0f, 3.0f, 0.0f}; float f0 = vec0.x; // 1.0f float f1 = vec0.g; // 2.0f float f2 = vec0[2]; // 3.0f vec0.a = 4.0f; // 4.0f

咱们还可使用swizzles的方式来进行赋值,能够一次性提供多个份量进行赋值操做,这些份量的名称能够重复出现:

float4 vec0 = {1.0f, 2.0f, 3.0f, 4.0f}; float3 vec1 = vec0.xyz; // (1.0f, 2.0f, 3.0f) float2 vec2 = vec0.rg; // (1.0f, 2.0f) float4 vec3 = vec0.zzxy; // (4.0f, 4.0f, 1.0f, 2.0f) vec3.wxyz = vec3; // (2.0f, 4.0f, 4.0f, 1.0f) vec3.yw = ve1.zz; // (2.0f, 3.0f, 4.0f, 3.0f) 矩阵(matrix)

矩阵有以下类型(以float为例):

float1x1 float1x2 float1x3 float1x4 float2x1 float2x2 float2x3 float2x4 float3x1 float3x2 float3x3 float3x4 float4x1 float4x2 float4x3 float4x4

此外,咱们也可使用相似模板的形式来描述:

matrix<float, 2, 2> mat1; // float2x2

而单独的matrix类型的变量实际上能够看作是一个包含了4个vector向量的类型,即包含16个float类型的变量。matrix自己也能够写成float4x4:

matrix mat1; // float4x4

矩阵的初始化方式以下:

float2x2 mat1 = { 1.0f, 2.0f, // 第一行 3.0f, 4.0f // 第二行 }; float3x3 TBN = float3x3(T, B, N); // T, B, N都是float3

矩阵的取值方式以下:

matrix M; // ... float f0 = M._m00; // 第一行第一列元素(索引从0开始) float f1 = M._12; // 第一行第二列元素(索引从1开始) float f2 = M[0][1]; // 第一行第二列元素(索引从0开始) float4 f3 = M._11_12; // Swizzles

矩阵的赋值方式以下:

matrix M; vector v = {1.0f, 2.0f, 3.0f, 4.0f}; // ... M[0] = v; // 矩阵的第一行被赋值为向量v M._m11 = v[0]; // 等价于M[1][1] = v[0];和M._22 = v[0]; M._12_21 = M._21_12; // 交换M[2][3]和M[3][2]

不管是向量仍是矩阵,乘法运算符都是用于对每一个份量进行相乘,例如:

float4 vec0 = 2.0f * float4(1.0f, 2.0f, 3.0f, 4.0f); //(2.0f, 4.0f, 6.0f, 8.0f) float4 vec1 = vec0 * float4(1.0f, 0.2f, 0.1f, 0.0f); //(2.0f, 0.8f, 0.6f, 0.0f)

若要进行向量与矩阵的乘法,则须要使用mul函数。

在C++代码层中,DirectXMath数学库建立的矩阵都是行矩阵,但当矩阵从C++传递给HLSL时,HLSL默认是列矩阵的,看起来就好像传递的过程当中进行了一次转置那样。若是但愿不发生转置操做的话,能够添加修饰关键字row_major:

row_major matrix M; 数组

和C++同样,咱们能够声明数组:

float M[4][4]; int p[4]; float3 v[12]; // 12个3D向量 结构体(struct) (责任编辑:admin)