着色器基本语法与现代 GPU 运算指令
阅读
2023-09-10更新
最新编辑:B1ueMicr0
阅读:
更新日期:2023-09-10
最新编辑:B1ueMicr0
HLSL - 高阶着色语言
自从 Source DX9 开始,Valve 游戏引擎便一直都提供 HLSL(High Level Shading Language) 着色语言的支持。对于 Source 2 的 s&box 来说也一样。HLSL 语法上和 Cg 也比较像,并且运算符和控制流也和 C++ 类似,这里不再赘述。下面是 HLSL 的一些基本语句的参考,当然我们也提供一些常用函数综合作为您的案头工具。
标量
bool // 布尔值,值为 true 或 false
int // 32 位有符号整数
uint // 32 位无符号整数
half // 16 位半精度浮点值
float // 32 位单精度浮点值
double // 64 位双精度浮点值
矢量
由 1 - 4 个标量数组成,每个数的类型必须一致。
bool bVector; // 布尔型
int1 iVector = 1; // 整数矢量
float3 fVector = { 0.2f, 0.3f, 0.4f }; // 浮点矢量
矩阵
由 1 - 16 (4*4) 个标量数组成,同样地,每个数的类型必须一致。
int1x1 iMatrix; // 1x1 的整数矩阵
int4x1 iMatrix; // 4x1 的整数矩阵
int1x4 iMatrix; // 1x4 的整数矩阵
double3x3 dMatrix; // 3x3 的双精度浮点矩阵
float2x2 fMatrix = { 0.0f, 0.1, // 第一行 // 2x2 单精度浮点矩阵
2.1f, 2.2f // 第二行
};
控制流
和 C++ 很类似。—— 编辑者
break
continue
discard
do
for
if
while
//...
数据类型
采样器类型
做渲染就是一个不断采样的过程。—— Real-Time Rendering 4th Edition
sampler1D
sampler2D
sampler3D
samplerCUBE
sampler_state
SamplerState
结构体类型
struct
缓冲区类型
e.g.
Buffer<float4> g_Buffer;
float4 bufferData = g_Buffer.Load(1);
着色器类型
Set (XXX) Shader
//e.g.
SetVertexShader
SetPixelShader
//-----------------//
ShaderFunction
ShaderTarget
纹理类型
Texture1D
Texture1DArray
Texture2D
Texture2DArray
Texture3D
TextureCube
e.g.
texture tex0; // 声明纹理对象
sampler2D s_2D = sampler_state // 声明采样器对象
{
Texture = <tex0>; // 指定被采样的纹理
Filter = MIN_MAG_MIP_LINEAR; // 指定纹理过滤方式
AddressU = Wrap; // 纹理寻址
AddressV = Wrap;
常用函数
abs(x) //绝对值
ceil(x) //返回大于等于 x 的最小整数
floor(x) //返回小于等于 x 的最大整数
cos(x) //余弦,x 的单位为弧度
sin(x) //正弦,x 的单位为弧度
tan(x) //正切,x 的单位为弧度
sincos(in x,out s,out c) //返回 x 的余弦和正弦,x 的单位为弧度
clamp(x,a,b) //将 x 限制在 [a,b] 之间,即 x<=a , 则 x=a ; x>=b ,则 x=b
saturate(x) //返回 clamp(x,0.0,1.0)
clip(x) //仅在像素着色器中使用,若 x < 0 ,则把当前像素丢弃
cross(u,v) //叉乘(Cross Product)
dot(u,v) //点乘(Dot Product)
ddx(p) //计算屏幕空间中的偏导数 dp / dx
ddy(p) //计算屏幕空间中的偏导数 dp / dy
distance(u,v) //返回两点间的欧式距离
degrees(x) //将 x 从弧度化为角度
radians(x) //将 x 从角度化为弧度
sqrt(x) //根号 x
rsqrt(x) //根号 x 的倒数
determinant(M) //返回矩阵的行列式
frac(x) //返回x数据中的小数点后面的部分,e.g.(1.20,3.12)——>(0.20,0.12)
length(v) //返回向量的模长
lerp(u,v,t) //在u,v之间线性插值
log(x) -ln(x)
log10(x) //对数运算
log2(x)
max(x,y)
min(x,y)
mul(M,N) //矩阵相乘
normalize(v) //向量标准化
pow(b,n) //b^n
transpose(M) //返回转置矩阵
reflect(v,n) //根据给出的入射向量v (view vector) 和法线 n,返回反射向量
refract(v,n,η) //根据给出的入射向量 v 和法线 n,以及入出材质的折射率之比 η,返回折射向量
tex2D(s,t) //s 采样器类型,t 为 2D 纹理坐标,返回2D纹理中相应的纹理颜色
texCUBE(s,v) //s 采样器类型,t 为 3D 查找向量,返回立方体纹理中相应的纹理颜色
GPU 基本运算法则
以下为基本 GPU 运算功能,是您了解 GPU 计算的核心。
MAD //加法 (a+b)
MUL //乘法 (a*b)
FMA //融合乘加 (a*b+c) (相比于传统 MUL+MAD,精度更高)
FMUL //浮点乘法 (a*b) (float)
FMAD //浮点加法 (a+b) (float)