2016-03-20 8 views
2

HLSL имеет тип cbuffer, который может использоваться для справочных таблиц.HLSL эквивалент cbuffer в GLSL

Что такое эквивалент для cbuffer s в OpenGL? Каков рекомендуемый способ хранения поисковых таблиц?

ответ

2

Эквивалентная функциональность «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» являются основным способом получения однородных данных в шейдер.

+0

Итак, если я правильно понимаю это, я должен создать буфер с помощью 'glGenBuffers()' и заполнить правильные байты. Впоследствии я могу использовать 'glUniformBlockBinding()', чтобы назначить сгенерированный буфер в мой единый блок. Могу ли я предположить, что float и другие типы данных имеют такое же представление на уровне бит, что и на моем процессоре, поскольку я могу назначать байты только VOB? – maja