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
  • 总览
  • DXC
  • FXC
  • HLSL to SPIR-V
  • 选择
  • shader 规则
  • HShaderCompiler
  • hshader 格式
  • 其他资料
  1. Shader

Shader 交叉编译

Previous实例化渲染NextShader Toy

Last updated 2 years ago

总览

DXC

dxc 需要在GitHub上下载,但是我在Windows sdk中也找到了:C:\Program Files (x86)\Windows Kits\10\bin\10.0.20348.0\x64,这里我们是从GitHub上下载下来的。

dxc 把 hlsl 编译成 spir-v 的例子(可以用 dxc.exe -help 查看所有参数):

dxc.exe -Zpc -HV 2021 -T vs_6_0 -E VS -spirv -fspv-target-env=vulkan1.1 -Fh test Test_VS.hlsl

-Fh 参数可以编译成一个头文件,然后就能直接包含使用了。

直接编译给 D3D12 使用:

dxc.exe -Zpc -HV 2021 -T vs_6_0 -E VS -Fh test Test_VS.hlsl

我们可以改变头文件的变量名字,并且生成反射文件:

dxc.exe -Zpc -HV 2021 -T vs_6_0 -E VS -Fh test.h -Vn Test_VS_VS -Fre test.ref Test_VS.hlsl

FXC

fxc 包含于Windows sdk中,我们直接在 C:\Program Files (x86)\Windows Kits\10\bin\10.0.20348.0\x64 可以拿到。

fxc.exe /T vs_5_0 /E VS /Fo CACHES/DXBC/Test_Triangle.vert Test_Triangle.hshader
fxc.exe /T ps_5_0 /E PS /Fo CACHES/DXBC/Test_Triangle.frag Test_Triangle.hshader

fxc 是可以支持 SM5.1 的,但是 dx11 似乎只能用到 5.0 ?参见:

https://learn.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-devices-downlevel-intro

HLSL to SPIR-V

https://github.com/KhronosGroup/Vulkan-Guide/blob/main/chapters/hlsl.adoc

https://github.com/microsoft/DirectXShaderCompiler/blob/main/docs/SPIR-V.rst

选择

shader编译有离线和在线两种选择,对于dx,可以有三种方法:(参考https://zhuanlan.zhihu.com/p/594417850

  • 离线编译成 cso 字节码, 在程序启动读取 cso 字节码, 创建 pipeline state object

  • 离线编译 .h 文件, 其中有个 unsigned char 的全局变量, 直接 include 对应的文件使用

  • 在程序运行期间编译着色器代码,并读取生成的字节码

一般会有一个uber shader,然后会生成很多变体(例如某项目最终所有的变体加起来有7w个着色器,每个着色器变体都会对应一个pso)。

进一步可以参考:

shader 规则

shader可以指定入口,比如 Test.shader,vertex shader的入口是VS_MAIN,那么可以通过:

dxc.exe -Zpc -HV 2021 -T vs_6_0 -E VS_MAIN -Vn Test_VS -Fh Test_VS.dxil Test.hlsl

这样子,如果是 vs 就在原来的名字后面加尾缀 VS,生成的头文件的变量名也保持一致。

但是这样子产生头文件的方式,代码包含后还得hard code数组的名字才行,就无法自定义一个shader直接拖给材质使用了,因此还是直接生成dxil,然后直接解析文件来的好:

dxc.exe -Zpc -HV 2021 -T vs_6_0 -E VS_MAIN -Fo Test_VS.dxil Test.hlsl
dxc.exe -Zpc -HV 2021 -T vs_6_0 -E VS_MAIN -spirv -fspv-target-env=vulkan1.1 -Fo Test_VS.spirv Test.hlsl

HShaderCompiler

-p:编译指定路径下的所有 hshader 文件(递归搜寻)

HShaderCompiler.exe -p C:\WorkSpace\HEngineDev\Project\Shaders

-s:编译该shader文件,需要是 .hshader 文件:

HShaderCompiler.exe -s C:\WorkSpace\HEngineDev\Project\Shaders\Test_Triangle.hshader

hshader 格式

需要在文件最顶部指定 shader 类型与入口,例如:

#pragma htype vs VS
#pragma htype ps PS

此时dxc会按照vs_6_6编译,fxc按照vs_5_0编译

其他资料

本人也物色到一个不错的库:https://github.com/GPUOpen-LibrariesAndSDKs/RenderPipelineShaders

是AMD家的,但是我看了一下,协议非常严格,完全不能商用。只能够作为学习参考。

Shader variants - Unity 手册
着色器加载 - Unity 手册
Logo
Logo