Подстановка цвета с атрибутами вершины - PullRequest
2 голосов
/ 01 декабря 2011

У меня большой набор вершин, и в настоящее время я использую glColorPointer, чтобы указать их цвет.Проблема в том, что glColorPointer принимает только размер 3 или 4 в качестве первого параметра, но значения R, G и B для каждой вершины идентичны.

Конечно, я мог бы использовать glVertexAttribPointerчтобы указать каждое значение цвета в качестве атрибута размера один и продублировать его в шейдере, но я ищу способ сделать это в конвейере с фиксированной функцией.Вызов glColor1*, к сожалению, невозможен, учитывая количество вершин (Да, я пробовал это сделать).

Любое творческое решение, которое втискивает значение во что-то другое, тоже нормально.

Ответы [ 2 ]

3 голосов
/ 01 декабря 2011

Я думаю, что без шейдеров это будет невозможно, поскольку glColorPointer принимает только размер 3 или 4, как вы уже узнали (также не должно быть glColor1, только glColor3 и glColor4).

Вы можете обмануть glColorPointer, чтобы использовать плотно упакованный массив, указав размер 3, но шаг 1 (ubyte) или 4 (float).Но это даст вам цвет (Ri, Ri+1, Ri+2) для вершины i, и его невозможно настроить на (Ri, Ri, Ri), поскольку цветовая матрица применяется не к цветам на вершину, а только к пиксельным изображениям.

Так что без шейдеров у вас не так много творчества.Что вы могли бы сделать, это использовать 1D текстуру размером 256, которая содержит все серые цвета от (0, 0, 0) до (255, 255, 255) по порядку.Тогда вы можете просто использовать свой цвет для каждой вершины в качестве 1D-координаты текстуры в этой текстуре.Но я не уверен, что это действительно купит вам что-нибудь в пространстве или времени.

Простой и прямой способ - использовать атрибуты вершины и шейдер для реализации распаковки атрибута в цвет фрагмента.Это занимает всего несколько строк шейдерного кода и должно быть предпочтительным решением.Настоящая трудность здесь заключается в искусственном ограничении, а не в самом проблемном пространстве.Такие случаи должны быть обработаны путем снятия ограничения.

0 голосов
/ 01 декабря 2011

Вы можете сохранить информацию о цвете в 1D текстуре (только с одним каналом), затем вы можете использовать вершинный шейдер, который считывает правильный цвет на основе gl_vertexID.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...