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