通过 AMD Smoldr 增强 DirectX 测试

发布: (2026年3月18日 GMT+8 00:00)
5 分钟阅读

Source: AMD Developer Blog

编写小型图形应用程序并运行它们历来都不是一件容易的事。
尤其是随着 Microsoft DirectX® 12 和 Vulkan™ 等低层 API 的出现,完成设置并让着色器代码在 GPU 上运行往往需要大量代码。

随着 Google 发布的 Amber,Vulkan 的情况发生了改变。Amber 使得只需几行代码就能声明缓冲区和着色器并在 GPU 上运行。直到现在,我们仍缺少 DirectX 的等价工具。

今天,我们发布了 AMD Smoldr,这是一款使用文本输入文件在 GPU 上运行 DirectX 12 着色器的简易脚本工具。

什么是 Smoldr?

Smoldr 允许通过 DXIL 编译 HLSL 着色器,创建管线、资源、视图,然后绑定并运行计算调度。所有这些都由基于文本的脚本文件控制——无需 C++ 开发。该项目是开源的(GitHub 仓库),欢迎贡献。请注意,Smoldr 仍在开发中;脚本语法尚未固定,未来可能会更改。作为命令行工具,目前的重点是计算,因此计算着色器运行良好,但也支持全部光线追踪功能!

一张脚本图胜千言万语,下面是一个示例,展示如何将两个缓冲区的内容相加并将结果写入第三个缓冲区:

# Create a HLSL source called csshader
SOURCE csshader

ByteAddressBuffer inbuf[2] : register(t0); // SRV
RWByteAddressBuffer outbuf : register(u0); // UAV

// One workgroup consists of 32 threads
[numthreads(32, 1, 1)]
void CSMain(uint3 DTid : SV_DispatchThreadID)
{
  // Take 2 numbers from first buffer, one from second, and sum them
  unsigned int first_idx = DTid.x * 2;
  float first = inbuf[0].Load(first_idx * 4) + inbuf[0].Load((first_idx + 1) * 4);
  float sum = first + inbuf[1].Load(DTid.x * 4);
  outbuf.Store(DTid.x * 4, sum);
}
END

# Compile the source with dxc into a binary called csobj
OBJECT csobj csshader cs_6_4 CSMain

# Allocate buffers in GPU memory for input and output
BUFFER inbuf  DATA_TYPE float SIZE 64 SERIES_FROM 0   INC_BY .25
BUFFER inbuf2 DATA_TYPE float SIZE 32 SERIES_FROM 10.0 INC_BY .25
BUFFER outbuf DATA_TYPE float SIZE 32 FILL 0

# The root signature
ROOT default
  TABLE UAV REGISTER 0 NUMBER 1 SPACE 0
  TABLE SRV REGISTER 0 NUMBER 2 SPACE 0
END

# Create a compute pipeline called cspipe
PIPELINE cspipe COMPUTE
  ATTACH csobj
  ROOT   default
END

# Create views that point to the complete buffers
VIEW inview  inbuf  AS SRV
VIEW inview2 inbuf2 AS SRV
VIEW outview outbuf AS UAV

# Run the pipeline with 1x1x1 workgroups, so 32 threads
DISPATCH cspipe
  BIND 0 TABLE outview
  BIND 1 TABLE inview
RUN 1 1 1

# Outbuf should contain the added inbuf + inbuf2 now
# Check that the shader worked as expected
EXPECT outbuf float OFFSET 0  EQ 10.25 11.5 12.75 14
EXPECT outbuf float OFFSET 64 EQ 30.25 31.5 32.75 34

# Print a buffer's content to the terminal
DUMP outbuf float

仅需这些步骤,就能运行一个完整的 DirectX 12 应用程序:

成功运行 Smoldr

Smoldr 的构建目标是用于玩转 DirectX 12 API、驱动程序以及硬件。这就要求在出现意外情况时提供尽可能多的帮助。即使只是一个拼写错误,Smoldr 也会指出错误发生的具体位置和原因:

Smoldr 显示错误信息

其他值得注意的特性包括对 Microsoft Agility SDK 的支持,以尝试新的实验性 HLSL 功能。像 AMD Radeon™ GPU Profiler 这样的图形工具可以通过 --window 选项捕获 Smoldr 脚本,弹出窗口并在每帧执行一次脚本。

接下来是什么?

Compute 和光线追踪管线运行良好,接下来要支持的重大功能是网格着色器。网格(以及放大)着色器将使在 Smoldr 中轻松使用现代图形渲染。敬请期待!

资源

  • 源代码已在 GitHub 上提供:
  • 脚本语言语法可在 此处 找到:
  • AMD 开发者社区 讨论此博客:

DirectX 是微软公司在美国及其他国家的注册商标或商标。
Vulkan 及其标志是 Khronos Group Inc. 的注册商标。其他名称仅供参考,可能是其各自所有者的商标。

0 浏览
Back to Blog

相关文章

阅读更多 »

第2天:为什么仅仅更努力不足

当我还是个孩子的时候,我卖 Scout‑O‑Rama 票。数学很简单:敲更多的门,获得更多的销售,赢得更大的奖品。卖软件并不那么不同……

Razorpay 支付拆分路由

什么是 Razorpay Route?Razorpay Route 是 Razorpay 提供的功能,能够将收到的资金在不同的卖家、供应商、第三方之间进行分配。