Я пытаюсь декомпилировать более 30k файлов шалдеров vulkan с помощью шейдера c от Google. Все шейдеры находятся в "C: \ Users \ Admin \ Desktop \ NMS MOD \ SHADER MOD \ v2.41 \ P C"
. Инструментом, используемым для декомпиляции, является spirv-cross.exe, который Я добавил в Windows переменные окружения, что позволяет мне запускать этот простой bat-файл в папке шейдеров и работает нормально. "spirv-cross --version 450 --vulkan-semantics --stage frag ATMOSPHERE_FRAG_CLOUD_769.SPV> ATMOSPHERE_FRAG_CLOUD_769.GLSL"
Поскольку их слишком много, чтобы сделать это вручную. Я хочу создать простое приложение для этого процесса, а также получить тип сцены из имени файла (в данном случае «frag»).
using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;
namespace Lazy_Me_3
{
public partial class Form1 : Form
{
public string PATH;
public string[] sFilesNames;
public int totalcount = 0;
public int currentcount = 0;
public Form1()
{
InitializeComponent();
}
private string GetStageType(string filename)
{
// Valid Stages = vertex, vert, fragment, frag, tesscontrol, tesc, tesseval, tese, geometry, geom, compute, comp
if (filename.Contains("_VERTEX_") || filename.Contains("_VERT_")) return "vert";
if (filename.Contains("_FRAGMENT_") || filename.Contains("_FRAG_")) return "frag";
if (filename.Contains("_TESSCONTROL_") || filename.Contains("_TESC_")) return "tesc";
if (filename.Contains("_TESSEVEL_") || filename.Contains("_TESE_")) return "tese";
if (filename.Contains("_GEOMETRY_") || filename.Contains("_GEOM_")) return "geom";
if (filename.Contains("_COMPUTE_") || filename.Contains("_COMP_")) return "comp";
else return "error";
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < sFilesNames.Count(); i++)
{
sFilesNames[i] = Path.GetFileName(sFilesNames[i]);
if (sFilesNames[i].Length > 1)
{
var newName = sFilesNames[i].Substring(0, sFilesNames[i].Length - 4);
sFilesNames[i] = newName;
}
}
foreach (var file in sFilesNames)
{
string stageType = GetStageType(file);
if (stageType != "error")
{
string args = "--version 450 --vulkan-semantics --stage " + stageType + " " + file + ".SPV" + " > " + file + ".GLSL";
Process process = new Process();
process.StartInfo.FileName = "spirv-cross";
process.StartInfo.Arguments = args;
process.StartInfo.WorkingDirectory = PATH;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
process.WaitForExit(5000);
currentcount += 1;
label1.Text = "Status : " + currentcount.ToString() + " / " + totalcount.ToString();
}
else MessageBox.Show("Error on finding stage type of file : " + file);
}
}
private void button2_Click(object sender, EventArgs e)
{
using (var fbd = new FolderBrowserDialog())
{
DialogResult result = fbd.ShowDialog();
if (result == DialogResult.OK && !string.IsNullOrWhiteSpace(fbd.SelectedPath))
{
sFilesNames = Directory.GetFiles(fbd.SelectedPath, "*.SPV");
totalcount = sFilesNames.Length;
PATH = fbd.SelectedPath;
label3.Text = "Directory : " + PATH;
label2.Text = "Total Count : " + totalcount.ToString();
label1.Text = "Status : 0 / " + totalcount.ToString();
button1.Enabled = true;
}
}
}
}
}
РЕДАКТИРОВАТЬ 1: Bodge с помощью cmd, который работает
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < sFilesNames.Count(); i++)
{
//sFilesNames[i] = Path.GetFileName(sFilesNames[i]);
if (sFilesNames[i].Length > 1)
{
var newName = sFilesNames[i].Substring(0, sFilesNames[i].Length - 4);
sFilesNames[i] = newName;
}
}
foreach (var file in sFilesNames)
{
string stageType = GetStageType(file);
if (stageType != "error")
{
var p = new ProcessStartInfo("cmd", @"/c spirv-cross --version 450 --vulkan-semantics --stage " + stageType + " " + file + ".SPV" + " > " + file + ".GLSL");
p.UseShellExecute = false;
p.CreateNoWindow = true;
var ps = Process.Start(p);
ps.WaitForExit();
currentcount += 1;
label1.Text = "Status : " + currentcount.ToString() + " / " + totalcount.ToString();
}
else
{
errorcount += 1;
label4.Text = "Errors : " + errorcount.ToString();
}
}
}