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 值 | 是的 | 不 |
隐式类型转换 | 广泛的 | 受限制的 |