Implementation of HLSL to GLSL source converter
DirectX and OpenGL use different shading languages, which share a lot in common, but sometimes differ substantially. For cross-platform applications, maintaining two versions of each shader is time-consuming and error-prone. Diligent Engine uses HLSL2GLSL Converter that allows shader authored in HLSL to be converted into GLSL source.
The converter supports HLSL5.0, all shader types (vertex, geometry, pixel, domain, hull, and compute) as well as most of the language constructs. There are however few special requirements that must be met in order for the HLSL source to be successfully converted to GLSL:
ATTRIBn
semantic, where n defines the location of the corresponding GLSL input variable (layout(location = n)
). For any other input semantic, the converter automatically assigns input location.Inputs of a subsequent shader stage must be declared in exact same order as outputs of the previous shader stage. Return value of a function counts as its first output.
The converter parses all input and output arguments (including structure members) in the order of declaration and automatically assigns locations to every argument. To make sure that input and output locations match, the arguments must be declared in exact same order. For the same reason, if an argument is not used by the shader, it still needs to be declared to preserve original ordering.
The code snippet below gives examples of supported shader declarations:
For example, the following is a valid domain shader declaration:
The following rules are used to convert HLSL texture declaration into GLSL sampler:
HLSL texture dimension defines GLSL sampler dimension:
Texture2D
-> sampler2D
TextureCube
-> samplerCube
HLSL texture component type defines GLSL sampler type. If no type is specified, float4
is assumed:
Texture2D<float>
-> sampler2D
Texture3D<uint4>
-> usampler3D
Texture2DArray<int2>
-> isampler2DArray
Texture2D
-> sampler2D
To distinguish if sampler should be shadow or not, the converter tries to find <Texture Name>_sampler
among samplers (global variables and function arguments). If the sampler type is comparison, the texture is converted to shadow sampler. If sampler state is either not comparison or not found, regular sampler is used. For example
is converted to
GLSL requires format to be specified for all images (rw textures) allowing writes. HLSL converter allows GLSL image format specification inside the special comment block:
float3
(vec3
) structure members correctly. It is strongly suggested avoid using this type in structure definitionsDO NOT pass structs to functions, use only built-in types!!!
float4 vec = 0;
-> float4 vec = float4(0.0, 0.0, 0.0, 0.0);
float x = 0;
-> float x = 0.0;
uint x = 0;
-> uint x = 0u;
float4(0, 0, 0, 0)
. It must be written as float4(0.0, 0.0, 0.0, 0.0)
Less
LessEqual
Greater
GreaterEqual
Equal
NotEqual
Not
And
Or
BoolToFloat
bool2 b = x < y;
-> b = Less(x, y);
all(p>=q)
-> all( GreaterEqual(p,q) )
mat[row][column]
In GLSL, the first index is always a column: mat[column][row]
MATRIX_ELEMENT(mat, row, col)
macros is provided to facilitate matrix element retrievalTexture2DArray.SampleCmpLevelZero()
TextureCube.SampleCmpLevelZero()
TextureCubeArray.SampleCmpLevelZero()
Converter does not perform macros expansion, so usage of preprocessor directives is limited to text block that do not need to be converted. The following are some examples that are not supported.
Using macros in declarations of shader entry points:
The following is not allowed as well:
In cases like that it is necessary to create two separate shader entry points and give them distinctive names. Likewise, macros cannot be used in definitions of structures that are used to pass data between shader stages:
Similarly to shader entry points, in the scenario above, the two structures need to be defined with distinctive names. Shader macros are allowed in structures that are not used to pass data between shader stages.
Defining language keywords with macros is not allowed:
Macros can be used within function bodies:
Please visit this page for the full list of supported language features.