XShaderCompiler
Master Thesis: Cross-Compiling Shading Languages
3 条項 BSD ライセンス
バージョン: 0.11 Alpha (製品コードでは使用しないでください! )
詳細については、TODO.md ファイルを参照してください。
特徴 | 進捗 | 備考 |
---|---|---|
頂点シェーダー | ~80% | 言語機能はまだほとんど残っていない |
テッセレーション コントロール シェーダー | ~20% | InputPatch およびパッチ定数関数の変換が進行中です |
テッセレーション評価シェーダ | ~20% | 出力パッチの翻訳が進行中です |
ジオメトリシェーダ | ~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」という 2 つの 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 |
---|---|---|
テクスチャとサンプラーの分離 | はい | バルカン専用 |
構造の継承 | はい | いいえ |
入れ子構造 | はい | いいえ |
匿名構造 | はい | いいえ |
構造体のメンバー関数 | はい | いいえ |
デフォルトパラメータ | はい | いいえ |
オブジェクト指向の組み込み関数 | はい | いいえ |
複数のエントリポイント | はい | いいえ |
タイプのエイリアス | はい | いいえ |
入力セマンティクスの L 値 | はい | いいえ |
暗黙的な型変換 | 広範囲にわたる | 制限付き |