HEngine
  • 引擎编译
  • 未来工作
  • 使用文档
    • 代码规范
    • Shader规范
    • config 配置
  • Python脚本系统
    • 技术分析
    • 使用api
  • Cpp脚本系统
    • 技术分析
  • 技术文档 & 心得体会
    • 数学
      • 坐标系、UV与深度范围
      • 行主序 与 列主序
    • 路径管理
    • 构建系统
    • 自定义资源格式
    • UI
      • undo/redo
      • 分辨率处理
    • ECS 系统
    • 插件系统
    • 数学库
    • Ref Counted
    • 音频
    • ChatGPT
    • Mesh、Vertex 等组织关系
    • 编辑器热更新方案
    • Profile
    • NLP
    • RenderDoc
    • CodeGen与反射系统
    • 安装包
    • 物理引擎
      • PhysX集成
      • Bullet集成
    • 动画
  • 图形后端
    • 坐标系差异
    • Feature差异
    • RHI 封装
    • Shader与Constant Buffer
    • DX12
    • Vulkan
    • Render Graph
    • 渲染整体架构
  • 图形Feature
    • 毛发
    • 鼠标拾取
    • 实例化渲染
  • Shader
    • Shader 交叉编译
    • Shader Toy
    • Shader 热更新
    • PBR
  • 打包
    • 打包
  • Bug 记录 & 解决过程
    • 闪退记录汇总
    • 导入图片显示混乱
    • D3D下glfw+imgui失效
  • 其他资料
    • 总结集合
Powered by GitBook
On this page
  • 基础规则
  • 代码规范
  1. 使用文档

Shader规范

使用hlsl进行引擎shader代码的编写。

基础规则

对于头文件,一律用 .hlsli ,例如 Engine/Shaders/Common.hlsli

对于用于参与编译的文件,即包含pixel shader之类的shader文件(下称为源文件),用 .hlsl

头文件必须要加宏,对于 Common.hlsli,示例:

#ifndef COMMON_HENGINE
#define COMMON_HENGINE

你的shader代码

#endif

源文件则需要加 pragma 宏用于标识,这样HEngine的shader编译器会识别并正确编译,例子:

test.hlsl

#include "Include/Common.hlsli"

#pragma hshader Custom

#pragma hpass vs VS
#pragma hpass ps PS
#pragma hpass TestPBR vs VS
#pragma hpass TestPBR ps TestPS

namespace PROPERTIES
{
    #pragma hrange g_sliderTest 1.0 5.0
    #pragma hrange g_intTest -1 1

    Texture2D g_texture;
    SamplerState g_sampler;

    cbuffer cbTest
    {
        float g_sliderTest;
        int g_intTest;
        float4 g_color;
    }
}

VertexOut VS(VertexIn vIn)
{
    VertexOut vOut;
    float4 WorldPos = mul(Model, float4(vIn.pos, 1.0));
    vOut.WorldPos = WorldPos.xyz;
    vOut.Normal = mul((float3x3)Model, vIn.normal);
    vOut.TexCoord = vIn.texcoord;
    vOut.PosH = mul(ViewProjection, WorldPos);
    return vOut;
}

float4 PS(VertexOut pIn) : SV_Target
{
    return PROPERTIES::g_color;
}

float4 TestPS(VertexOut pIn) : SV_Target
{
    return PROPERTIES::g_color;
}

在上面的示例中,我们的 Vertex Shader 为 VS 函数,#pragma htype vs VS 就是告诉 HEngine 的shader 编译器这个信息。同理有 #pragma htype ps PS

即对于顶点着色器,我们需要加宏:#pragma htype vs xxx 来告诉编译器 xxx 是入口。

  1. 指定shader类型(待定) 我们使用 #pragma hshader Custom 来指定shader的类型是 Custom。目前类型有 Default、Custom、CustomPBR、PostProcess。Default使用的是引擎自带的 BasePBR 的shader,CustomPBR则是自己定义的 PBR 规则,此时编辑器会有 PBR 特殊处理的属性。

  2. 多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

  3. 定义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代码。

Previous代码规范Nextconfig 配置

Last updated 1 year ago