Shader规范
使用hlsl进行引擎shader代码的编写。
基础规则
对于头文件,一律用 .hlsli ,例如 Engine/Shaders/Common.hlsli
对于用于参与编译的文件,即包含pixel shader之类的shader文件(下称为源文件),用 .hlsl
头文件必须要加宏,对于 Common.hlsli,示例:
源文件则需要加 pragma 宏用于标识,这样HEngine的shader编译器会识别并正确编译,例子:
在上面的示例中,我们的 Vertex Shader 为 VS 函数,#pragma htype vs VS 就是告诉 HEngine 的shader 编译器这个信息。同理有 #pragma htype ps PS
即对于顶点着色器,我们需要加宏:#pragma htype vs xxx 来告诉编译器 xxx 是入口。
指定shader类型(待定) 我们使用 #pragma hshader Custom 来指定shader的类型是 Custom。目前类型有 Default、Custom、CustomPBR、PostProcess。Default使用的是引擎自带的 BasePBR 的shader,CustomPBR则是自己定义的 PBR 规则,此时编辑器会有 PBR 特殊处理的属性。
多pass指定 我们使用 #pragma hpass 来指定shader的pass name以及入口函数。如果没有指定pass name则默认为这个shader文件的名字。 例如例子中,我们一共定义了两个pass,第一个未指定pass name,则为默认的test,最终编译会得到文件 test.vs test.ps(位于 CACHES 中,dx11对应的文件夹为 CACHES/DXBC );第二个指定了pass name为 TestPBR ,最终编译会得到文件 TestPBR.vs TestPBR.ps
定义shader属性 一般我们是 Custom 类型,此时编辑器会将 namespace PROPERTIES 这里面的所有内容反射到面板中,对于范围调整(例如上面的 float g_sliderTest,反射到面板中会是一个滑条),则通过 #pragma hrange g_sliderTest 1.0 5.0 指令来指定它的最大值最小值。
除了例子中的 vs ps,我们shader一共有6种类别,分别对应:
vs:VertexShader
ps:PixelShader
cs:ComputeShader
hs:HullShader
ds:DomainShader
gs:GeometryShader
依此类推,我们可以编写:#pragma hpass HBH cs CS_Entry,最终就会得到编译后的文件:HBH.cs 了
Shader编译时会首先parse一遍shader,生成 .meta 文件,位于 Shaders/CACHES 中,编辑器再去读这个文件就知道面板应该如何显示属性了。
代码规范
对于 cbuffer 中的变量,统一加前缀 g_Xxx,g代表global的意思。
#include "Include/Common.hlsli" 应该写在 Shader 文件的最前面,因为里面有关闭 pragma 宏指令的warning代码。
Last updated