XShaderCompiler
Master Thesis: Cross-Compiling Shading Languages
3조 BSD 라이센스
버전: 0.11 Alpha ( 프로덕션 코드에서는 사용하지 마세요! )
자세한 내용은 TODO.md 파일을 참조하세요.
특징 | 진전 | 비고 |
---|---|---|
버텍스 셰이더 | ~80% | 아직 언어 기능이 거의 남아 있지 않습니다. |
테셀레이션 제어 셰이더 | ~20% | InputPatch 및 패치 상수 함수 변환이 진행 중입니다. |
테셀레이션 평가 셰이더 | ~20% | OutputPatch 번역 진행 중 |
기하학 셰이더 | ~60% | 코드 생성이 불완전합니다 |
조각 셰이더 | ~80% | 아직 언어 기능이 거의 남아 있지 않습니다. |
컴퓨트 셰이더 | ~80% | 아직 언어 기능이 거의 남아 있지 않습니다. |
다음 명령줄은 꼭짓점 셰이더 진입점이 "VS"이고 조각 셰이더 진입점이 "PS"인 "Example.hlsl" 파일을 변환합니다.
xsc -E VS -T vert Example.hlsl -E PS -T frag Example.hlsl
결과는 "Example.VS.vert"와 "Example.PS.frag"라는 두 개의 GLSL 셰이더 파일입니다.
# 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 이상 필요):
다음은 XShaderCompiler가 적절하게 변환할 수 있는 HLSL과 GLSL 간의 상위 수준 차이점에 대한 간략한 개요입니다.
특징 | HLSL | GLSL |
---|---|---|
텍스처와 샘플러의 분리 | 예 | Vulkan에만 해당 |
구조 상속 | 예 | 아니요 |
중첩된 구조 | 예 | 아니요 |
익명 구조 | 예 | 아니요 |
구조체 멤버 함수 | 예 | 아니요 |
기본 매개변수 | 예 | 아니요 |
객체지향 내장 | 예 | 아니요 |
다중 진입점 | 예 | 아니요 |
유형 앨리어싱 | 예 | 아니요 |
입력 의미의 L-값 | 예 | 아니요 |
암시적 유형 변환 | 광범위한 | 제한된 |