OpenGL может раскрашивать прямоугольник градиентом цветов от одной стороны к другой. Я использую для этого следующий код на C ++
glBegin(GL_QUADS);
{
glColor3d(simulationSettings->hotColour.redF(), simulationSettings->hotColour.greenF(), simulationSettings->hotColour.blueF());
glVertex2d(keyPosX - keyWidth/2, keyPosY + keyHight/2);
glColor3d(simulationSettings->coldColour.redF(), simulationSettings->coldColour.greenF(), simulationSettings->coldColour.blueF());
glVertex2d(keyPosX - keyWidth/2, keyPosY - keyHight/2);
glColor3d(simulationSettings->coldColour.redF(), simulationSettings->coldColour.greenF(), simulationSettings->coldColour.blueF());
glVertex2d(keyPosX + keyWidth/2, keyPosY - keyHight/2);
glColor3d(simulationSettings->hotColour.redF(), simulationSettings->hotColour.greenF(), simulationSettings->hotColour.blueF());
glVertex2d(keyPosX + keyWidth/2, keyPosY + keyHight/2);
}
Я использую некоторые библиотеки Qt для преобразования между HSV и RGB. Как видно из кода, я рисую прямоугольник с цветовым градиентом от того, что я называю hotColour до coldColour.
Зачем я это делаю? Программа, которую я сделал, рисует трехмерные векторы в пространстве и указывает их длину цветом. Пользователю предлагается выбрать горячий (высокое значение) и холодное (низкое значение) цвета, и программа автоматически выполнит градиент, используя масштабирование HSV.
Почему масштабирование HSV? потому что HSV имеет однозначное значение на цветовой карте, которую я использую, и линейное создание градиентов с его помощью - очень простая задача. Чтобы пользователь мог выбрать цвета, я предлагаю ему цветовую карту QColourDialog
http://qt-project.org/doc/qt-4.8/qcolordialog.html
На этой цветовой карте вы можете видеть, что красный цвет доступен справа и слева, что делает невозможным получение линейной шкалы для этой цветовой карты с RGB. Но с HSV очень легко получить линейную шкалу, где мне просто нужно использовать линейную шкалу от 0 до 360 для значений оттенка.
С помощью этой парадигмы мы можем видеть, что горячие и холодные цвета определяют направление градиента, поэтому, например, если я выберу оттенок равным 0 для холодного и 359 для горячего, HSV даст мне градиент между 0 и 359 и будет включить в градиент весь спектр цветов; в то время как в OpenGL он в основном будет переходить от красного к красному, что не является градиентом !!!!!!
Как я могу заставить OpenGL использовать градиент HSV, а не RGB? Единственная идея, которая приходит мне в голову, - это разрезать прямоугольник, который я хочу раскрасить, и делать много градиентов по меньшим прямоугольникам, но я думаю, что это не самый эффективный способ сделать это.
Любые идеи?