HLSL имеет тип cbuffer
, который может использоваться для справочных таблиц.HLSL эквивалент cbuffer в GLSL
Что такое эквивалент для cbuffer
s в OpenGL? Каков рекомендуемый способ хранения поисковых таблиц?
HLSL имеет тип cbuffer
, который может использоваться для справочных таблиц.HLSL эквивалент cbuffer в GLSL
Что такое эквивалент для cbuffer
s в OpenGL? Каков рекомендуемый способ хранения поисковых таблиц?
Эквивалентная функциональность «cbuffer» в GLSL - это uniform interface block, данные которого взяты из buffer object. Совокупность концепции называется «Uniform Buffer Object». Хотя в отличие от D3D, OpenGL не помещает эти буферы как отличающиеся от любого другого типа буферного объекта. Таким образом, вы можете использовать один и тот же буферный объект для хранения униформ и вершинных данных или (более полезно) в качестве вывода операции обратной связи преобразования. Или что угодно.
Унифицированный блок объявлен в шейдере немного как HLSL cbuffers, но в стиле GLSL:
uniform BlockName
{
vec4 someVariable;
} optionalInstanceName;
Хотя UBOs являются 3,1 функция OpenGL, вы должны использовать OpenGL 4.2 или ARB_shading_language_420pack если вы хочу, чтобы иметь возможность связать блок с индексом связывания в шейдер:
//BlockName uses binding point 0.
layout(binding = 0) uniform BlockName
{
vec4 someVariable;
} optionalInstanceName;
Без этой функции, вы должны использовать glUniformBlockBinding
вручную установить точки привязки для блока с именем BlockName
. Хотя сначала вам нужно запросить индекс этого блока с помощью glGetUniformBlockIndex
. Но как только он установлен, он является частью состояния объекта программы, поэтому вам не нужно устанавливать его более одного раза.
В любом случае, я бы не охарактеризовал UBOs или cbuffers как «look-up-tables». В частности, в HLSL, где «cbuffer» являются основным способом получения однородных данных в шейдер.
Итак, если я правильно понимаю это, я должен создать буфер с помощью 'glGenBuffers()' и заполнить правильные байты. Впоследствии я могу использовать 'glUniformBlockBinding()', чтобы назначить сгенерированный буфер в мой единый блок. Могу ли я предположить, что float и другие типы данных имеют такое же представление на уровне бит, что и на моем процессоре, поскольку я могу назначать байты только VOB? – maja