XShaderCompiler
Master Thesis: Cross-Compiling Shading Languages
ใบอนุญาต BSD 3 ข้อ
เวอร์ชัน: 0.11 Alpha ( ห้ามใช้ในรหัสการผลิต! )
ดูไฟล์ TODO.md สำหรับข้อมูลเพิ่มเติม
คุณสมบัติ | ความคืบหน้า | หมายเหตุ |
---|---|---|
เวอร์เท็กซ์เชเดอร์ | ~80% | คุณสมบัติทางภาษาบางส่วนยังคงเหลืออยู่ |
เทสเซลเลชั่นคอนโทรลเชเดอร์ | ~20% | อยู่ระหว่างการแปล InputPatch และ patch-constant-function |
Shader การประเมินผล Tessellation | ~20% | อยู่ระหว่างการแปล OutputPatch |
เรขาคณิตเชเดอร์ | ~60% | การสร้างโค้ดไม่สมบูรณ์ |
ชิ้นส่วน Shader | ~80% | คุณสมบัติทางภาษาบางส่วนยังคงเหลืออยู่ |
คำนวณเชเดอร์ | ~80% | คุณสมบัติทางภาษาบางส่วนยังคงเหลืออยู่ |
บรรทัดคำสั่งต่อไปนี้แปลไฟล์ "Example.hlsl" ด้วยจุดเข้าของจุดยอดเชเดอร์ "VS" และจุดเข้าของเชเดอร์ส่วน "PS":
xsc -E VS -T vert Example.hlsl -E PS -T frag Example.hlsl
ผลลัพธ์ที่ได้คือไฟล์ GLSL shader สองไฟล์: "Example.VS.vert" และ "Example.PS.frag"
# include < Xsc/Xsc.h >
# include < fstream >
# include < iostream >
int main ()
{
// Input file stream (use std::stringstream for in-code shaders).
auto inputStream = std::make_shared<std::ifstream>( " Example.hlsl " );
// Output file stream (GLSL vertex shader)
std::ofstream outputStream ( " Example.VS.vert " );
// Fill the shader input descriptor structure
Xsc::ShaderInput inputDesc;
inputDesc. sourceCode = inputStream;
inputDesc. shaderVersion = Xsc::InputShaderVersion::HLSL5;
inputDesc. entryPoint = " VS " ;
inputDesc. shaderTarget = Xsc::ShaderTarget::VertexShader;
// Fill the shader output descriptor structure
// Use outputDesc.options, outputDesc.formatting, and outputDesc.nameMangling for more settings
Xsc::ShaderOutput outputDesc;
outputDesc. sourceCode = &outputStream;
// Optional output log (can also be a custom class)
Xsc::StdLog log ;
// Optional shader reflection data (for shader code feedback)
Xsc::Reflection::ReflectionData reflectData;
// Translate HLSL code into GLSL
try
{
bool result = Xsc::CompileShader (inputDesc, outputDesc, & log , &reflectData);
}
catch ( const std:: exception & e)
{
std::cerr << e. what () << std::endl;
}
return 0 ;
}
using System ;
using System . IO ;
namespace Example
{
class Program
{
static void Main ( )
{
// Create instance of the XShaderCompiler
var compiler = new XscCompiler ( ) ;
// Fill the shader input descriptor structure
var inputDesc = new XscCompiler . ShaderInput ( ) ;
inputDesc . SourceCode = File . ReadAllText ( "Example.hlsl" ) ;
inputDesc . ShaderVersion = XscCompiler . InputShaderVersion . HLSL5 ;
inputDesc . EntryPoint = "VS" ;
inputDesc . Target = XscCompiler . ShaderTarget . VertexShader ;
// Fill the shader output descriptor structure
// Use outputDesc.Options, outputDesc.Formatting, and outputDesc.MameMangling for more settings
var outputDesc = new XscCompiler . ShaderOutput ( ) ;
// Optional output log (can also be a custom class)
var log = compiler . StandardLog ;
// Optional shader reflection data (for shader code feedback)
var reflectData = new XscCompiler . ReflectionData ( ) ;
// Translate HLSL code into GLSL
try
{
bool result = compiler . CompileShader ( inputDesc , outputDesc , log , reflectData ) ;
if ( result )
{
// Write output shader code
File . WriteAllText ( "Example.VS.vert" , outputDesc . SourceCode ) ;
}
}
catch ( Exception e )
{
Console . WriteLine ( e ) ;
}
}
}
}
มีการจัดเตรียมดีบักเกอร์แบบเรียลไทม์พร้อม UI แม้ว่าดีบักเกอร์นี้ส่วนใหญ่จะใช้สำหรับการพัฒนาคอมไพเลอร์เอง แต่ยังสามารถใช้เพื่อภาพรวมการแปลอย่างรวดเร็ว เพื่อดูว่าโครงสร้างภาษาถูกคอมไพล์ข้ามกันอย่างไร
ตัวอย่างของดีบักเกอร์แบบเรียลไทม์ (ต้องใช้ wxWidgets 3.1.0 หรือใหม่กว่า):
ต่อไปนี้เป็นโครงร่างโดยย่อของความแตกต่างระดับสูงระหว่าง HLSL และ GLSL ซึ่ง XShaderCompiler สามารถแปลได้อย่างถูกต้อง:
คุณสมบัติ | เอชแอลเอสแอล | GLSL |
---|---|---|
การแยกพื้นผิวและตัวอย่าง | ใช่ | สำหรับวัลแคนเท่านั้น |
การสืบทอดโครงสร้าง | ใช่ | เลขที่ |
โครงสร้างที่ซ้อนกัน | ใช่ | เลขที่ |
โครงสร้างที่ไม่ระบุชื่อ | ใช่ | เลขที่ |
ฟังก์ชั่นโครงสร้างสมาชิก | ใช่ | เลขที่ |
พารามิเตอร์เริ่มต้น | ใช่ | เลขที่ |
อินทรินซิกเชิงวัตถุ | ใช่ | เลขที่ |
ทางเข้าหลายจุด | ใช่ | เลขที่ |
พิมพ์นามแฝง | ใช่ | เลขที่ |
ค่า L ของความหมายอินพุต | ใช่ | เลขที่ |
การแปลงประเภทโดยนัย | กว้างขวาง | ถูกจำกัด |