2015-09-13 3 views
1

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

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

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

к этому:

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

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

+0

редактирование вопроса, чтобы он частично аннулировал уже данный ответ, по крайней мере, немного неудачен ... – derhass

+0

@derhass Я не хотел этого делать? Это была ошибка с моей стороны, которую я не видел, пока ты не сказал это, поскольку я создавал вопрос из памяти. Я не хочу путать кого-либо другого, у кого может быть эта проблема. – Jadd23

ответ

4

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

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

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

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

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

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

+0

Извинения. Я ошибался между параметрами шага и размера - «1 * 4» и «4 * 4» не должно быть. Теперь я изменил это. Итак, 64-битные целые числа недействительны? Будет ли тот же случай применяться для установки цвета как единого? – Jadd23

+2

Я не вижу, что делать с 64-битными целыми числами. На самом деле GLSL не поддерживает такой тип. Существуют некоторые расширения для конкретного поставщика. И форма - совершенно другой случай. – derhass

Смежные вопросы