У меня есть теоретический вопрос: вместо того, чтобы использовать стандартную цветовую модель RGBA в буферах массивов OpenGL, почему бы просто не вырезать 12 дополнительных байтов на вершину и заменить ее 1 целым числом, содержащим цвет в шестнадцатеричном формате? Затем в шейдере вы можете преобразовать это обратно в vec4.
Так что я имею в виду, заменить это:
glVertexAttribPointer(COL_INDEX, 4, GL_FLOAT, false, stride, offset);
К этому:
glVertexAttribPointer(COL_INDEX, 1, GL_INT, false, stride, offset);
Я пытался искать везде онлайн, и я ничего не нашел об этом. Кроме того, есть ли преимущества в производительности для сохранения этих 12 байтов? Спасибо за ваше время.
Прежде всего, используя 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
).