Java — использование шестнадцатеричных цветов в OpenGL

У меня есть теоретический вопрос: вместо того, чтобы использовать стандартную цветовую модель RGBA в буферах массивов OpenGL, почему бы просто не вырезать 12 дополнительных байтов на вершину и заменить ее 1 целым числом, содержащим цвет в шестнадцатеричном формате? Затем в шейдере вы можете преобразовать это обратно в vec4.

Так что я имею в виду, заменить это:

glVertexAttribPointer(COL_INDEX, 4, GL_FLOAT, false, stride, offset);

К этому:

glVertexAttribPointer(COL_INDEX, 1, GL_INT, false, stride, offset);

Я пытался искать везде онлайн, и я ничего не нашел об этом. Кроме того, есть ли преимущества в производительности для сохранения этих 12 байтов? Спасибо за ваше время.

1

Решение

Прежде всего, используя 4*4 в качестве аргумента размера для glVertexAttribPointer является недействительным. Допустимые размеры от 1 до 4, и 4 — это именно то, что вам нужно, так как вам нужно 4 канала для кодирования векторов RGBA.

Вторая версия не очень полезна. Если мы игнорируем фальшивку 1*4 таким же образом и использовать только один канал, он может работать в принципе, но glVertexAttribPointer не может использоваться для установки целочисленных атрибутов. Что это будет делать, это создание float атрибут в шейдере, а формат данных в буфере GL_INT, Здесь вы потеряете некоторую точность, поскольку вы не можете представить все 2 ^ 32 целочисленных значения в точности как 32-битные числа с плавающей запятой, что полностью испортит результаты.

Вы могли бы использовать glVertexAttribIPointer (обратите внимание, я в середине), чтобы настроить int приписывать.

Однако вам не нужна такая сложная операция. Все, что тебе нужно

glVertexAttribPointer(COL_INDEX, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, offset)

использовать 4 отдельных байта в качестве vec4 атрибут, который автоматически нормализуется до диапазона [0,1] при обращении к шейдеру (это цель установки normalize аргумент этой функции GL_TRUE).

4

Другие решения


По вопросам рекламы [email protected]