Как я могу иметь единый буферный массив символов или коротких строк?

#opengl #glsl

#opengl #glsl

Вопрос:

По-видимому, в OpenGL нет типов, которые являются 8-битными или 16-битными. Мне нужно отправить единый массив с каждым элементом массива, состоящим из:

 unsigned short (16 bit) xPosition;
unsigned short (16 bit) yPosition;
unsigned short (16 bit) radius;
 

Каждый треугольник ссылается на эти значения, поэтому я могу разделить на gl_VertexID, чтобы получить текущий рисуемый треугольник. Проблема в том, что эти значения составляют 3 коротких строки (48 бит, 3 байта) каждая. Например, если я рисую вершину с номером 8, я могу сделать 8/3 = 2, и я знаю, что рисую треугольник 2 (третий треугольник), но тогда как мне индексировать в однородный буфер, чтобы получить xPosition, yPosition и radius? Нет ли простого способа просто иметь единый буферный массив или символы или короткие строки в glsl?

Ответ №1:

Вам придется сделать математику самостоятельно. Вам нужно будет прочитать одно или несколько 32-разрядных целых чисел без знака и выполнить маскировку / сдвиг в бит, чтобы извлечь интересующие вас значения.

Не делая это встроенной функцией GLSL, API не создает у вас впечатления, что более короткие чтения переменных будут такими же быстрыми, как чтение 32-разрядных целых чисел.

При этом, вероятно, было бы лучше для вас просто использовать буфер вершин (хотя данные вершин, которые не выровнены по 4 байта, вероятно, не являются хорошей идеей).