为非传统应用程序集成 RenderDoc

最初发布时间:
Matthãus Chajdas's avatar
Matthãus Chajdas

RenderDoc 是一个出色的图形应用程序调试工具,对许多图形 API 都有广泛的支持。然而,有时 RenderDoc 无法弄清楚你在做什么。例如:我最近在调试一个着色器编译器问题,为此我使用了一个只进行一次提交和一次调度的简单测试程序。这不像任何游戏的样子,没有真正的帧开始或结束,我实际上只关心捕获调度,那么我该如何告诉 RenderDoc 我在做什么呢?

幸运的是,这很容易实现,这要归功于 RenderDoc API。它只需要一些小的代码改动,无需额外的链接步骤,并且在不使用 RenderDoc 时不会影响任何其他内容。我们需要做什么?很简单:如果我们启用了 RenderDoc,`renderdoc.dll` 文件就会存在,因此我们可以从此文件中查询 API。然后我们使用它手动启动/停止捕获。如果你已经阅读了 API 文档,那么你可能已经准备就绪,如果你还没有,请继续阅读 😊

实际上非常简单,你只需要获取 RenderDoc API 指针,一旦获取到,就可以使用 API 来控制 RenderDoc。对于 API,你需要包含头文件(它位于你的 RenderDoc 安装目录中),从那里开始就一切顺利了。

RENDERDOC_API_1_0_0* GetRenderDocApi()
{
RENDERDOC_API_1_0_0* rdoc = nullptr;
HMODULE module = GetModuleHandleA("renderdoc.dll");
if (module == NULL)
{
return nullptr;
}
pRENDERDOC_GetAPI getApi = nullptr;
getApi = (pRENDERDOC_GetAPI)GetProcAddress(module, "RENDERDOC_GetAPI");
if (getApi == nullptr)
{
return nullptr;
}
if (getApi(eRENDERDOC_API_Version_1_0_0, (void**)&rdoc) != 1)
{
return nullptr;
}
return rdoc;
}

你可以在应用程序的任何时候执行此操作。一旦你的设备准备就绪,就可以使用以下命令触发捕获:

if (rdoc)
{
rdoc->StartFrameCapture(nullptr, nullptr);
}

并使用以下命令停止:

if (rdoc)
{
rdoc->EndFrameCapture(nullptr, nullptr);
}

请注意,如果你的应用程序运行速度超快,就像我的应用程序一样——只运行了几毫秒——那么 UI 可能跟不上。一个简单的解决方法是在退出前等待按键。这只是 RenderDoc API 可以做的事情的开始。请务必查看文档以获取更多详细信息和高级用例!

Matthãus Chajdas's avatar

Matthãus Chajdas

Matthäus Chajdas 是 AMD 架构与软件技术团队的一名软件/硬件架构师,他致力于未来的 API、编程模型和硬件。此前,他曾在 AMD 的游戏开发者关系部门工作,帮助 ISV 从 AMD GPU 中获得最大收益。

相关新闻和技术文章

相关视频

© . This site is unofficial and not affiliated with AMD.