python做的游戏可以导出吗_Python for RenderDoc批量导出模型和贴图

本文介绍了一种使用Python脚本配合RenderDoc工具,实现批量导出游戏模型和贴图的方法。通过在RenderDoc中截取图像,然后利用Python API导出图片和CSV数据,并在Unity中转换为模型。文章详细讲解了Python调用RenderDoc接口的步骤,包括导出图片、顶点数据等,并提供了源码示例。
摘要由CSDN通过智能技术生成

故事背景:

美术那里有需求,需要别人游戏的模型,来借鉴一下,问我是否有工具可以一键导出模型。我就搜索了一下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 documentation​renderdoc.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#源码可以参考这里RenderDocMeshParserForUnity​github.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

<
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值