全站通知:

着色器基本语法与现代 GPU 运算指令

阅读

    

2023-09-10更新

    

最新编辑:B1ueMicr0

阅读:

  

更新日期:2023-09-10

  

最新编辑:B1ueMicr0

来自S&boxWIKI_BWIKI_哔哩哔哩
跳到导航 跳到搜索
页面贡献者 :
布朗尼蛋糕-

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)

扩展学习资源

High-level shader language (HLSL)