网站建设怎么找客源?,微网站建设企划书,网站建设的网页,百度推广官网HLSL High Level Shader Language 高级着色语言#xff0c;是Direct3D中用来编写Shader的语言。其语法类似于C语言。
虽然其主要作用是用来编写例如顶点着色器#xff0c;像素着色器。但本质是对图形并行管线进行编程#xff0c;因此也能用来编写用于计算的着色器#xff…HLSL High Level Shader Language 高级着色语言是Direct3D中用来编写Shader的语言。其语法类似于C语言。
虽然其主要作用是用来编写例如顶点着色器像素着色器。但本质是对图形并行管线进行编程因此也能用来编写用于计算的着色器甚至AI相关的计算。但是微软提供了更方便的DirectML框架专门用于机器学习编程框架。
在学习HLSL之前需要对DirectX3D拥有一定知识因为对于HLSL整个生命周期例如创建编译优化绑定链接等都和DirectX3D紧密相关。
使用HLSL的流程
HLSL也是一种高级语言。在编写完源文件.hlsl之后需要将其通过D3DCompileFromFile或者D3DCompile函数编译成DXBC(DirectX Bytecode)这是一种更接近于硬件操作描述的面向HW的中间语言如下
dcl_input v0.xyz
dcl_input v1.xy
然后再将包含DXBC的ID3DBlob接口绑定到PipelineState中。之后在Vertex和Pixel阶段
这里以D3DCompileFromFile为例说一下参数的意义。下面是每个参数的含义
D3DCompileFromFile(_In_ LPCWSTR pFileName, // 着色器code的路径_In_reads_opt_(_Inexpressible_(pDefines-Name ! NULL)) CONST D3D_SHADER_MACRO* pDefines, // 编译时定义的宏_In_opt_ ID3DInclude* pInclude, // 指定include处理其通常设置为D3D_COMPILE_STANDARD_FILE_INCLUDE_In_ LPCSTR pEntrypoint, // 该着色器的入口函数_In_ LPCSTR pTarget, // 指定该shader的目标profile_In_ UINT Flags1, // 编译选项例如检验选项调试选项_In_ UINT Flags2, // 效果文件选项Shader设置为0_Out_ ID3DBlob** ppCode, // 存贮编译完成的DXBC_Always_(_Outptr_opt_result_maybenull_) ID3DBlob** ppErrorMsgs); // 输出的错误信息
基础语法
HLSL语法类似于C语言比方定义变量表达式调用函数等都和C一样也有一些独特的语法例如定义结构体
struct VS_INPUT
{float4 Position : POSITION; // 模型顶点位置
};
定义函数
float4 PSMain(PSInput input) : SV_TARGET
{return input.color;
}后面会跟上: SV_TARGET或者: POSITION。其为语义(semantic)表明了该变量的用途和存储位置。
也有其独特的语法结构例如定义Constant Buffer.
cbuffer SceneConstantBuffer : register(b0)
{float4 offset;float4 padding[15];
};
表示定义一块在register b0上的constant buffer名为SceneConstantBuffer。
语法为
BufferType [Name] [: register(b#)] { VariableDeclaration [: packoffset(c#.xyzw)]; ... };
有两种Buffer, Constant Buffer和Texture Buffer。顾名思义前者是变量后者用于保存纹理。通常常量缓冲区对CPU访问有优化。每个常量缓冲区可以容纳多达4096个向量每个向量包含多达四个32位值。每个管道阶段可以绑定多达14个常量缓冲区另外两个插槽保留用于内部使用。
对于任意索引的数据纹理访问与缓冲区访问相比可以具有更好的性能。每个管道阶段可以绑定多达128个纹理缓冲区。
当CPU需要访问缓冲区是需要进行map.如m_constantBuffer-Map(...)。
同时需要讲创建好的常量缓冲区资源通过CreateConstantBufferView将该常亮对象绑定到HLSL上。