首页 / 资讯中心 / 文章详情

RenderDoc Python 脚本实战:枚举纹理、在纹理查看器中展示并保存到磁盘

RenderDoc Python 脚本实战:枚举纹理、在纹理查看器中展示并保存到磁盘 ★ FEATURED ARTICLE
开发工具调试器图形学GPU【免费下载链接】renderdocRenderDoc is a stand-alone graphics debugging tool.项目地址https://gitcode.com/gh_mirrors/re/renderdoc点击查看免费下载本篇文章基于 RenderDoc 官方 Python API 示例show_texture.rst对应可执行脚本 show_texture.py展开完整演示如何在 RenderDoc 的 Python 脚本窗口中遍历当前捕获中的所有纹理并计算其尺寸、将面积最大的纹理显示为纹理查看器的锁定标签页以及通过TextureSave配置把纹理分别保存为 JPG / PNG / DDS 三种格式。读完本文你将掌握CaptureContext、ReplayController、TextureSave等核心 API 的实际用法并理解纹理枚举、视图展示与磁盘导出的完整数据流。示例背景与运行前提该示例位于 RenderDoc 仓库的 docs/python_api/examples 目录对应脚本文件为show_texture.py。在 RenderDoc 图形界面中可以通过Python 脚本窗口参见 window/python_scripting.rst直接运行它脚本名称即为 Show and save a texture。脚本开头通过两个全局模块提供 API 访问import renderdoc import qrenderdoc # 便于在 VS Code 中编辑时获得自动补全提示 from typing import TYPE_CHECKING if TYPE_CHECKING: pyrenderdoc qrenderdoc.CaptureContext()其中renderdoc与底层回放replay相关的数据类型与接口例如ResourceId、TextureSave、FileType、AlphaMapping、CompType、ReplayController等qrenderdocUI 层相关接口例如CaptureContext全局脚本上下文、TextureViewer、ExtensionManagerpyrenderdoc脚本运行时由宿主注入的全局CaptureContext实例TYPE_CHECKING分支仅为静态类型检查工具提供自动补全不影响运行时行为。示例假定当前已经有一个捕获被加载。为增强脚本的健壮性脚本开头会检查是否已加载捕获如果没有则弹出文件选择框让用户指定.rdc捕获文件并加载if not pyrenderdoc.IsCaptureLoaded(): filename pyrenderdoc.Extensions().OpenFileName(Choose a capture, , *.rdc) pyrenderdoc.LoadCapture(filename, renderdoc.ReplayOptions(), filename, False, True)第一步遍历纹理元数据脚本通过CaptureContext.GetTextures()获取当前捕获的所有纹理描述并逐个打印名称与宽高同时记录面积最大的那个纹理highestArea 0 largest None for tex in pyrenderdoc.GetTextures(): name pyrenderdoc.GetResourceName(tex.resourceId) print(f{name} is {tex.width} x {tex.height}) area tex.width * tex.height if area highestArea: highestArea area largest tex此处遍历得到的每个tex是renderdoc.TextureDescription对象其定义位于 renderdoc/api/replay/data_types.h包含以下关键字段字段类型含义resourceIdResourceId唯一标识该纹理的资源 ID用于后续展示与保存width/height/depthuint32_t纹理的基础尺寸一维纹理高度为 1二维纹理深度为 1dimensionuint32_t基础维度取值为 1、2 或 3formatResourceFormat每个像素的格式如 RGBA8、BC 压缩格式等mipsuint32_tmip 层级数量至少为 1arraysizeuint32_t数组元素数量至少为 1cubemapbool是否作为立方体贴图 / 立方体数组使用msSampuint32_t多重采样样本数至少为 1typeTextureType纹理类型如Texture2D、TextureCube、Texture3D等GetTextures()的接口声明位于 renderdoc/api/replay/renderdoc_replay.h它返回的是rdcarrayTextureDescription的常量引用属于ReplayController上最常用的查询接口之一。提示GetResourceName()由 UI 层CaptureContext提供可将ResourceId映射为可读的资源名例如vulkan_cloth_rgba.ktx这类原始资源名便于脚本输出可读信息。第二步在纹理查看器中打开纹理找到面积最大的纹理后脚本打印一条汇总信息并调用 UI 层 API 把它展示出来if largest is not None: name pyrenderdoc.GetResourceName(largest.resourceId) print(f\n Largest texture is {name}) # 在纹理查看器中打开最大纹理并聚焦到该标签页 pyrenderdoc.ShowTextureViewer() pyrenderdoc.GetTextureViewer().ViewTexture( largest.resourceId, renderdoc.CompType.Typeless, True )这里涉及两个关键调用CaptureContext.ShowTextureViewer()确保纹理查看器面板TextureViewer处于可见状态CaptureContext.GetTextureViewer().ViewTexture(resourceId, typeCast, focusTab)在该面板中打开指定纹理。第三个参数传True表示作为新的锁定标签页locked tab打开并聚焦即使后续切换查看其他资源该标签页也会保持在查看器中方便对比。上图中显示的vulkan_cloth_rgba.ktx标签页即是由此脚本打开的效果第二个参数CompType.Typeless表示不进行类型转换按纹理原始格式展示。关于CompType的作用可以从TextureSave.typeCast字段的文档得到侧面印证见 renderdoc/api/replay/control_types.h若传入非Typeless的组件类型如从无符号整数重解释为浮点、或转换为无符号归一化值数据会被重新解释展示。第三步保存纹理到磁盘获取 ReplayController保存纹理需要访问底层回放控制器。脚本使用了阻塞版本的控制器controller pyrenderdoc.GetBlockingController()CaptureContext.GetBlockingController()返回一个renderdoc.ReplayController其每个 API 调用都会自动在回放线程replay thread上以阻塞方式执行。对于在 Python 脚本窗口脚本运行在独立线程中运行的简单脚本这是一种便捷做法。但需要注意线程模型RenderDoc 的 UI 扩展UI extension代码运行在 UI 线程上如果在 UI 扩展中使用阻塞控制器纹理处理与写盘期间可能造成界面无响应。此时更推荐把工作迁移到回放线程详见 docs/python_api/in_depth/threading.rstReplayManager.AsyncInvoke/BlockInvoke回调以及CaptureContext.Replay().AsyncInvoke()方式。ReplayManager通过AsyncInvoke异步投递回调、BlockInvoke阻塞等待回调完成阻塞式调用应尽量少在 UI 线程上使用。选择保存路径接着调用ExtensionManager.SaveFileName弹出保存对话框并去除默认的.jpg扩展名后缀以便后续自由拼接不同格式filename pyrenderdoc.Extensions().SaveFileName( Choose where to save JPG/PNG/DDS texture files, , *.jpg ) filename filename.replace(.jpg, )配置 TextureSave不同文件格式对纹理数据的支持能力差异很大例如是否支持 mip、数组切片或 alpha 通道因此保存前需要配置renderdoc.TextureSave结构体。其完整定义位于 renderdoc/api/replay/control_types.h核心字段如下字段类型默认值说明resourceIdResourceId无要保存的纹理资源 IDdestTypeFileTypeDDS目标文件格式typeCastCompTypeTypeless是否按其他组件类型重解释数据mipint32_t-1要写出的 mip-1表示在格式允许时写出全部 mip否则写 mip 0sliceTextureSliceMapping见下数组/深度切片映射方式alphaAlphaMappingPreserve无 alpha 通道的文件格式如何处理 alphacompTextureComponentMapping见下黑白点映射用于 8-bit SRGB 输出sampleTextureSampleMapping见下多重采样纹理的解析方式channelExtractint-1提取单通道保存为灰度-1保存全部jpegQualityint90JPG 保存质量合法范围 1~100TextureSliceMapping定义见 renderdoc/api/replay/control_types.h提供数组纹理的映射选项sliceIndex选择要保存的切片-1表示写出全部切片仅在不原生支持切片且以 RGBA8 输出的格式中支持0表示仅保存第一个切片slicesAsGrid为True时把所有切片按二维网格排布输出网格宽度由sliceGridWidth指定空格子填充透明黑cubeCruciform为True时按十字形cruciform展开 6 个立方体面间隙填充透明黑。示例中针对三种格式的配置如下texsave renderdoc.TextureSave() texsave.resourceId largest.resourceId # 对不支持 alpha 的格式将 alpha 混合到棋盘格图案上 texsave.alpha renderdoc.AlphaMapping.BlendToCheckerboard # 大多数格式每个文件只能展示单张图像因此选择第一个 mip、第一个切片 texsave.mip 0 texsave.slice.sliceIndex 0AlphaMapping枚举定义位于 renderdoc/api/replay/replay_enums.h共四种取值取值行为Discard完全丢弃 alpha 通道只写 RGBBlendToColor使用 alpha 混合到主背景色alphaCol指定BlendToCheckerboard使用主/次背景色混合到棋盘格图案Preserve保留 alpha 通道仅对支持 alpha 的文件格式有效保存为 JPG 与 PNGJPG 不支持 alpha 通道使用上文配置的BlendToCheckerboardPNG 支持 alpha切换为Preserve以保留透明信息texsave.destType renderdoc.FileType.JPG controller.SaveTexture(texsave, filename .jpg) # 对于带 alpha 通道的格式保留 alpha texsave.alpha renderdoc.AlphaMapping.Preserve texsave.destType renderdoc.FileType.PNG controller.SaveTexture(texsave, filename .png)FileType枚举定义位于 renderdoc/api/replay/replay_enums.h支持DDS、PNG、JPG、BMP、TGA、HDR、EXR、Raw无元数据、无压缩的原始字节数据等格式。保存为 DDS 并导出全部 mip 与切片DDS 是少数能原生承载 mip 层级与数组切片的格式之一。为了把纹理的全部 mip 与全部数组切片写入同一个文件只需将mip与slice.sliceIndex都设为-1# DDS 纹理可以保存多个 mip 与数组切片因此不再使用默认的 # 保存 mip 0 与切片 0 的行为而是设为 -1 保存 *全部* mip 与切片 texsave.mip -1 texsave.slice.sliceIndex -1 texsave.destType renderdoc.FileType.DDS controller.SaveTexture(texsave, filename .dds)ReplayController.SaveTexture的接口签名位于 renderdoc/api/replay/renderdoc_replay.hvirtual ResultDetails SaveTexture(const TextureSave saveData, const rdcstr path) 0接收保存配置与磁盘路径返回ResultDetails以指示操作成败。进阶原始字节读取示例文档特别提示持有纹理的ResourceId后还可以通过ReplayController.GetTextureData(tex, sub)声明见 renderdoc/api/replay/renderdoc_replay.h获取指定子资源subresource的原始字节数据用于任意自定义处理例如像素级分析、自定义格式导出或程序化处理。这是SaveTexture之外更底层的纹理数据访问途径。小结通过本文的完整示例可以看到 RenderDoc Python API 处理纹理的三段式工作流枚举CaptureContext.GetTextures()GetResourceName()获取纹理清单与元数据展示ShowTextureViewer()GetTextureViewer().ViewTexture()将目标纹理以锁定标签页形式打开便于人工检视导出通过GetBlockingController()获取ReplayController配置TextureSave目标格式、mip/切片选择、alpha 处理策略调用SaveTexture()写出文件。其中TextureSave是导出的核心控制面理解mip、slice.sliceIndex、alpha与destType的组合语义即可应对从简单单图导出到完整 DDS 归档的各种保存需求。完整可运行源码可直接参考 docs/python_api/examples/show_texture.py并在 RenderDoc 的 Python 脚本窗口中以 Show and save a texture 名称运行。赞分享开发工具调试器图形学GPU【免费下载链接】renderdocRenderDoc is a stand-alone graphics debugging tool.项目地址https://gitcode.com/gh_mirrors/re/renderdoc点击查看免费下载相关推荐RenderDoc 纹理查看指南按名称定位纹理与锁定标签页实战RenderDoc 纹理查看指南按名称定位纹理与锁定标签页实战 导读 本文聚焦 RenderDoc独立图形调试工具中最常用的 Texture Viewer开发工具调试器图形学GPURenderDoc Python 扩展实战查询纹理与缓冲的显式内存绑定Memory BindingsRenderDoc Python 扩展实战查询纹理与缓冲的显式内存绑定Memory Bindings 导读 在 Vulkan 与 D3D12 这类支持显开发工具调试器图形学GPURenderDoc 自定义可视化着色器Custom Visualisation Shader完全指南在纹理查看器中用 HLSL/GLSL 解码与变换纹理RenderDoc 自定义可视化着色器Custom Visualisation Shader完全指南在纹理查看器中用 HLSL/GLSL 解码与变换纹理开发工具调试器图形学GPU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站