故事背景:
美术那里有需求,需要别人游戏的模型,来借鉴一下,问我是否有工具可以一键导出模型。我就搜索了一下RenderDoc批量导出图片,结果搜到了用C++改RenderDoc源码的文章。让RenderDoc批量导出纹理_专栏-CSDN博客blog.csdn.net
然后看了一下官网,看到了可以用python写工具的(因为不会C++,而且好像很麻烦的样子),我就试着用python来写RenderDoc的工具(其实我也不会python只是这种语言应该好学)。
使用步骤:
1.在RenderDoc里面截一张图。
2.运行RenderDoc的python shell。
3.导出图片与csv(因为只能导出csv,导不出模型,我会在unity里把他转为模型)
至于RenderDoc如何写python只要看下官网就可以了,这里贴出地址。Python API - RenderDoc documentationrenderdoc.org
原理分析:
主要还是python部分的原理,怎么调用RenderDoc接口,官网虽然有解析和例子,但是并不完全,导出图片的那个例子居然是导出output的图片。就是fragment Shader return出去的那个,完全没找到input的图片,我都是自己试出来的。
其实导出顶点CSV跟导出图片,都用到个这个函数
controller.GetPipelineState()
从这个pipeline的state里面获取,就是对应RenderDoc里面的这个面板
然后用这个函数
state.GetReadOnlyResources(renderdoc.ShaderStage.Fragment)
这个里面就有所有的图片的resourceId,可以写个循环保存所有的图片。
texsave = rd.TextureSave()
texsave.resourceId = resourceId
if texsave.resourceId == rd.ResourceId.Null():
return False
filename = str(int(texsave.resourceId))
texsave.mip = 0
texsave.slice.sliceIndex = 0
texsave.alpha = rd.AlphaMapping.Preserve
texsave.destType = rd.FileType.PNG
if not os.path.exists("{0}/{1}".format(folderName,eventId)):
os.makedirs("{0}/{1}".format(folderName,eventId))
outTexPath = "{0}/{1}/{2}.png".format(folderName,eventId,filename)
controller.SaveTexture(texsave, outTexPath)
同样的vertex也是这么获取,获取vertex index的resourceId,跟vertex自身的resourceId。
ib.state.GetIBuffer()
vbs.state.GetVBuffers()
....
something
...
meshInput.indexResourceId = ib.resourceId # vertex index的resourceId
meshInput.vertexResourceId = vbs[attr.vertexBuffer].resourceId # vertex自身的resourceId
然后根据resourceId去BufferData里面去得到vertex
controller.GetBufferData(meshInput.indexResourceId, meshInput.indexByteOffset, 0)
源码:只给出python源码,C#源码可以参考这里RenderDocMeshParserForUnitygithub.com
import sys
import csv
folderName = "C:/Users/Administrator/Desktop/capMesh1"
startIndex = 475
endIndex = 759
isPrint = False
# Import renderdoc if not already imported (e.g. in the UI)
if 'renderdoc' not in sys.modules and '_renderdoc' not in sys.modules:
import renderdoc
# Alias renderdoc for legibility
rd = renderdoc
# We'll need the struct data to read out of bytes objects
import struct
import os
# We base our data on a MeshFormat, but we add some properties
class MeshData(rd.MeshFormat):
indexOffset = 0
<