XShaderCompiler
Master Thesis: Cross-Compiling Shading Languages
3 條款 BSD 許可證
版本:0.11 Alpha (不要在生產代碼中使用! )
有關更多信息,請參閱 TODO.md 文件。
特徵 | 進步 | 評論 |
---|---|---|
頂點著色器 | 〜80% | 語言特徵所剩無幾 |
曲面細分控制著色器 | 〜20% | 輸入補丁和補丁常數函數翻譯正在進行中 |
曲面細分評估著色器 | 〜20% | OutputPatch 翻譯正在進行中 |
幾何著色器 | 〜60% | 程式碼生成不完整 |
片段著色器 | 〜80% | 語言特徵所剩無幾 |
計算著色器 | 〜80% | 語言特徵所剩無幾 |
以下命令列使用頂點著色器入口點「VS」和片段著色器入口點「PS」轉換「Example.hlsl」檔案:
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 ) ;
}
}
}
}
提供了帶有 UI 的即時調試器。雖然此偵錯器主要用於編譯器本身的開發,但它也可用於快速翻譯概述,以查看語言結構是如何交叉編譯的。
即時偵錯器的範例(需要 wxWidgets 3.1.0 或更高版本):
以下是 HLSL 和 GLSL 之間的高級差異的簡要概述,XShaderCompiler 能夠正確翻譯它們:
特徵 | HLSL | GLSL |
---|---|---|
紋理和採樣器的分離 | 是的 | 僅適用於 Vulkan |
結構繼承 | 是的 | 不 |
嵌套結構 | 是的 | 不 |
匿名結構 | 是的 | 不 |
結構體成員函數 | 是的 | 不 |
預設參數 | 是的 | 不 |
物件導向的內在函數 | 是的 | 不 |
多個入口點 | 是的 | 不 |
類型別名 | 是的 | 不 |
輸入語意的 L 值 | 是的 | 不 |
隱式型別轉換 | 廣泛的 | 受限制的 |