XShaderCompiler
Master Thesis: Cross-Compiling Shading Languages
3- بند ترخيص BSD
الإصدار: 0.11 Alpha ( لا تستخدمه في كود الإنتاج! )
راجع ملف TODO.md لمزيد من المعلومات.
ميزة | تقدم | ملاحظات |
---|---|---|
فيرتكس شادر | ~80% | لا يزال هناك القليل من ميزات اللغة المتبقية |
تظليل التحكم بالفسيفساء | ~20% | InputPatch وترجمة وظيفة التصحيح الثابتة قيد التقدم |
شادر تقييم التغطية بالفسيفساء | ~20% | ترجمة OutputPatch قيد التقدم |
تظليل الهندسة | ~60% | إنشاء التعليمات البرمجية غير مكتمل |
تظليل جزء | ~80% | لا يزال هناك القليل من ميزات اللغة المتبقية |
حساب شادر | ~80% | لا يزال هناك القليل من ميزات اللغة المتبقية |
يقوم سطر الأوامر التالي بترجمة الملف "Example.hlsl" باستخدام نقطة إدخال تظليل قمة الرأس "VS"، ونقطة إدخال تظليل الأجزاء "PS":
xsc -E VS -T vert Example.hlsl -E PS -T frag Example.hlsl
والنتيجة هي ملفين تظليل GLSL: "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 ) ;
}
}
}
}
يتم توفير مصحح أخطاء في الوقت الحقيقي مع واجهة المستخدم. على الرغم من أن مصحح الأخطاء هذا يستخدم بشكل أساسي لتطوير المترجم نفسه، إلا أنه يمكن استخدامه أيضًا للحصول على نظرة عامة سريعة على الترجمة، لمعرفة كيفية تجميع بنيات اللغة.
مثال لمصحح الأخطاء في الوقت الحقيقي (يتطلب الإصدار 3.1.0 من wxWidgets أو إصدار أحدث):
فيما يلي ملخص موجز للاختلافات عالية المستوى بين HLSL وGLSL، والتي يستطيع XSShaderCompiler ترجمتها بشكل صحيح:
ميزة | HLSL | GLSL |
---|---|---|
فصل القوام والعينات | نعم | فقط لفولكان |
وراثة الهيكل | نعم | لا |
الهياكل المتداخلة | نعم | لا |
الهياكل المجهولة | نعم | لا |
وظائف أعضاء الهيكل | نعم | لا |
المعلمات الافتراضية | نعم | لا |
الجوهرية الموجهة للكائنات | نعم | لا |
نقاط دخول متعددة | نعم | لا |
اكتب التعرج | نعم | لا |
L-قيم دلالات المدخلات | نعم | لا |
تحويل النوع الضمني | شاسِع | مقيد |