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数据的步骤:
  1. 选中某个Draw
  1. 在Pipeline State视图中找到需要查看的Shader阶段的对应Buffer
    1. notion image
  1. 点击右侧箭头展开查看Buffer内数据
    1. notion image
      notion image
 
 
此时输出结果
notion image
可以看到结构是匹配的,但是数值不匹配。实际查看API文档,该函数最后两个值填的是Buffer偏移和Buffer长度
notion image
通常情况下偏移当然是0,但是在某些情况下,同一个Drawcall的Vertex阶段和Pixel阶段,可能使用了同一个Buffer,但是使用了不同的偏移
notion image
notion image
可以看到样例中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)
 
Renderdoc自动化导出重组踩坑(一):Pycharm环境配置Renderdoc自动化导出重组踩坑(三):缺失的API描述