Я работаю над графическим API-интерфейсом, который должен работать как на DirectX9, так и на OpenGL (2.1 и нет единой поддержки буфера)
Я не хочу писать две версии шейдеров и нужно конвертировать между hlsl и glsl (Cg не вариант)
Я решил большинство проблем, используя lua для написания сценариев частей шейдера (создание фиктивной main на glsl для поддержки структур вершин и выходов и т. Д.), Но мне трудно получить правильные константы.
В hlsl могу написать:
float4x4 WorldViewProjection : register( c0 );
float4 ColorTint : register( c5 );
float3 UVOffset_Time : register( c6 );
и затем установите все это, используя:
SetVertexShaderConstantF( 0, pData, 6 )
В качестве альтернативы SetPixelShaderConstantF.
pData указывает на структуру с той же самой установкой (то есть матрица с плавающей точкой 4x4, вектор с плавающей точкой 4, вектор с плавающей точкой 3)
единственное решение, которое я нашел в glsl:
uniform vec4 UNIFORM0[ 6 ];
#define WorldViewProjection mat4( UNIFORM0[0], UNIFORM0[1], UNIFORM0[2], UNIFORM0[3] )
#define ColorTint UNIFORM0[4]
#define UVOffset_Time vec3( UNIFORM0[5].xyz )
и затем я получаю местоположение "UNIFORM0" из opengl и устанавливаю массив, используя glUniform4fvARB
Однако использование #defines для переноса моих констант в шейдеры довольно уродливо.
Есть ли способ установить константы аналогично hlsl и какие расширения мне понадобятся для этого?
Могу ли я использовать какую-то ссылку / typedef / handle для создания чего-то похожего на решение определения без использования фактического определения, например:
const mat4 WorldViewProjection = mat4( UNIFORM0[0], UNIFORM0[1], UNIFORM0[2], UNIFORM0[3] );