Как я могу установить константы шейдера при регистрации в glsl? - PullRequest
1 голос
/ 16 декабря 2011

Я работаю над графическим 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] );

1 Ответ

2 голосов
/ 16 декабря 2011

Есть ли способ установить константы аналогично hlsl и какие расширения мне понадобятся для этого?

Нет. Эта концепция не существует в OpenGL (ядро или расширения), и вряд ли она появится в будущем.

Для такого рода вещей было бы проще сделать вещи в стиле GLSL (запросить у шейдера одинаковые местоположения, использовать эти местоположения для установки значений), чем в стиле HLSL. В конце концов, в стиле HLSL вы просто запрашиваете то, что уже знаете. Вы делаете это больше, чем нужно, но проще добавить дополнительные ненужные запросы к одному API, чем пытаться удалить запросы из одного, который их требует.

...