高级着色器语言HLSL入门
1. 数据类型简介
与CPU不同,在显卡芯片中,最小的数据吞吐单元是一个由32位浮点数组成的四元组。这一点很有道理不是,想想你在渲染过程中所有涉及到的数据,最复杂的不外乎四维坐标(x,y,z,w)或颜色(r,g,b,a),这样GPU可以一次性处理一个四元组。而整数什么的在显卡中被放到四元组的一个分量里使用,而很多显卡中,整数、布尔值都不被直接支持,而是转为浮点数使用。至于矩阵,通常用4个四元组表示一个4x4矩阵(默认情况一个四元组存储一行,也可以指定按列存储,属于细节问题,goto:细节问题)其他尺寸的以此类推。
反映到程序上,一个四维向量就被声明为float4,4维方矩阵被声明为float4x4等等。当然,你也可以使用任意不超过4的维度的向量或矩阵,如int3,float3x3,double1。这个double1实际上就是标量了,1可以省略不写。
2. 纹理(Texture)&取样器(Sampler)简介
这俩东西可以看作特殊类型变量。纹理就是Shader中用到的贴图资源,这我想没什么好说的。来解释一下取样器:实际上每张贴图在使用的时候都要用一个取样器。取样器相当于这样一个结构,除了保存贴图本身数据之外,还包括过滤参数等取样信息。通常,读取贴图这样的指令接收的都是取样器类型的参数而并非直接接收纹理贴图。声明及使用纹理或取样器跟使用普通变量一样。这里有一些初始化取样器的方法,还是等到后面的实例中讲述吧。
3. 数据类型大全
数据类型有值类型、向量、矩阵、采样器、和结构体。
1.值类型
bool 布尔变量
half 16为整形
int 32位整形
float 单精度浮点数
double 双精度浮点数
声明方式:float f;
赋值方式:f = 1;
2.向量
声明方式:float4 f;
赋值方式:f = {1,2,3,4};
取值方式:float3 ff = f.rgb;
说明:向可以通过xyzw或者rgba访问向量中的指定字段,x或者r就是代表0号字段。不仅可以单独操作一个字段,还可以对多个字段同时操作,例如3f.xyz,就是将f中的xyz都乘以个3。
3.矩阵
声明方式:float2x4 f;