Лицензия BSD из 3 пунктов
Версия: 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 ) ;
}
}
}
}
Предоставляется отладчик реального времени с пользовательским интерфейсом. Хотя этот отладчик в основном используется для разработки самого компилятора, его также можно использовать для быстрого обзора перевода, чтобы увидеть, как происходит кросс-компиляция языковых конструкций.
Пример отладчика реального времени (требуется wxWidgets 3.1.0 или новее):
Вот краткое описание различий высокого уровня между HLSL и GLSL, которые XShaderCompiler может правильно преобразовать:
Особенность | ХЛСЛ | ГЛСЛ |
---|---|---|
Разделение текстур и сэмплеров | Да | Только для Вулкана |
Наследование структуры | Да | Нет |
Вложенные структуры | Да | Нет |
Анонимные структуры | Да | Нет |
Функции-члены структуры | Да | Нет |
Параметры по умолчанию | Да | Нет |
Объектно-ориентированные внутренности | Да | Нет |
Несколько точек входа | Да | Нет |
Тип псевдонимов | Да | Нет |
L-значения входной семантики | Да | Нет |
Неявное преобразование типов | Обширный | Ограниченный |