Могу ли я установить пользовательскую функцию, которая будет изменять цвет списка отображения в OpenGL?

У меня есть геометрия, сохраненная в списке отображения, но я хотел бы иметь возможность рисовать один и тот же список отображения с разными "оттенками" на них. Например, если бы в списке отображения был черно-белый череп, я бы хотел установить красный оттенок и нарисовать череп, затем установить синий оттенок и нарисовать череп.

Если я могу получить значения RGBA, я точно знаю, как их преобразовать, но я не уверен, где я могу их перехватить. В настоящее время списки отображения не содержат текстур, но, вероятно, они появятся в будущем, поэтому было бы хорошо, если бы ответ работал с текстурами или без них.

1 ответ

Решение

Концептуально список отображения - это просто набор команд, которые выполняются, когда вы glCallList, Поэтому, что бы оно ни содержало, оно будет таким, как если бы вы использовали эти команды напрямую (но, возможно, более производительно) Так что, если ваш список отображения содержит кучу команд геометрии, как вы можете их раскрасить? Да, вы догадались, используя обычные glColor Команда прямо перед вызовом списка:

glColor(...);
glCallList(...);

Если вы хотите, чтобы ваши объекты имели текстуру и оставались цветными, вы можете просто использовать заданную текстуру для GL_MODULATE (Я полагаю, вы не используете шейдеры, в противном случае весь вопрос был бы совсем устаревшим). Если вы хотите, чтобы ваши объекты освещались, хорошо поменяйте glColor в glMaterial, конечно.

Но если вы установите цвет в списке отображения, у вас не будет возможности его получить и изменить. Но я бы не советовал вам использовать списки отображения, так или иначе. Если вы используете их для хранения геометрии и для уменьшения копий CPU-GPU и накладных расходов на извлечение вызовов, то почему бы не использовать VBO, которые специально созданы для этого (и не страдают от такой неопределенной реализации).

Другие вопросы по тегам