type
Post
status
Published
date
Nov 27, 2024
slug
summary
tags
逆向
Python
疑难杂症
category
技术分享
icon
password
Renderdoc的Document对python的这套API有一些案例,改动不大,通常照抄就行,会比较直观的理解作用机制。然后再查一下API文档通常就好上手了。所以原封不动可以抄的部分这里不讲,详情请直接查看:
这里讲一下踩得坑,本篇为第一坑:Buffer数据存储方式的坑
Renderdoc的文档中专门有一篇案例教你如何提取shader相关信息,包括传入的buffer数据等内容,并提供了代码演示:
在这篇演示中针对拿到对应CBuffer的ResourceId和阶段后用以下函数进行了提取
cbufferVars = controller.GetCBufferVariableContents(pipe, ps.resourceId, rd.ShaderStage.Pixel, entry, 0, cb.descriptor.resource, 0, 0)
在实际测试时会发现这段代码输出的结果有概率与Renderdoc内打开查看Buffer内容时展示的数据不同
RenderDoc内查看Buffer数据的步骤:
- 选中某个Draw
- 在Pipeline State视图中找到需要查看的Shader阶段的对应Buffer

- 点击右侧箭头展开查看Buffer内数据


此时输出结果

可以看到结构是匹配的,但是数值不匹配。实际查看API文档,该函数最后两个值填的是Buffer偏移和Buffer长度

通常情况下偏移当然是0,但是在某些情况下,同一个Drawcall的Vertex阶段和Pixel阶段,可能使用了同一个Buffer,但是使用了不同的偏移


可以看到样例中VS与FS阶段都是用了ID序号为12951的buffer,但是ByteRange不一样,所以实际上,在FS阶段的同一个Buffer数据读取是存在ByteOffet的,其值实际就是VS阶段的ByteRange差,或者可以从PipeState.GetConstantBlocks获取到的ConstantBlock的列表中找到对应Block的descriptor信息,offset值存储在descriptor.byteOffset这个参数中,使用情况类似于:
blocks_data = state.GetConstantBlocks(rd.ShaderStage.Pixel, True) buffer_index = 0 while buffer_index < block_count: cb = blocks_data[buffer_index] cbufferVars = controller.GetCBufferVariableContents(pipe, ps.resourceId, rd.ShaderStage.Pixel, entry, buffer_index, cb.descriptor.resource, cb.descriptor.byteOffset, cb.descriptor.byteSize)
- 作者:Reguluz
- 链接:https://reguluz.site/article/14b65fbc-2b71-8050-949d-f46ecd8eb6ce
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章