Цветовая матрица OpenGL

Как заставить работать преобразования цветовой матрицы OpenGL?

Я изменил пример программы, которая просто рисует треугольник, и добавил код цветовой матрицы, чтобы посмотреть, могу ли я изменить цвета треугольника, но, похоже, это не работает.

    static float theta = 0.0f;
glClearColor( 1.0f, 1.0f, 1.0f, 1.0f );
glClearDepth(1.0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glPushMatrix();
glRotatef( theta, 0.0f, 0.0f, 1.0f );
glMatrixMode(GL_COLOR);

GLfloat rgbconversion[16] = 
{
    0.0f, 0.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 0.0f
};
glLoadMatrixf(rgbconversion);
glMatrixMode(GL_MODELVIEW);

glBegin( GL_TRIANGLES );
glColor3f( 1.0f, 0.0f, 0.0f ); glVertex3f( 0.0f, 1.0f , 0.5f);
glColor3f( 0.0f, 1.0f, 0.0f ); glVertex3f( 0.87f, -0.5f, 0.5f );
glColor3f( 0.0f, 0.0f, 1.0f ); glVertex3f( -0.87f, -0.5f, 0.5f );
glEnd();
glPopMatrix();

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


person Anthony Johnson    schedule 25.04.2009    source источник


Ответы (4)


Цветовая матрица применяется только к операциям передачи пикселей, таким как glDrawPixels, которые не имеют аппаратного ускорения на текущем оборудовании. Однако реализовать цветовую матрицу с помощью фрагментного шейдера очень просто. Вы можете просто передать свою матрицу как единый mat4, а затем умножить ее на gl_FragColor

person Lucas    schedule 08.05.2009
comment
Стоит отметить, что если вы забудете сбросить цветовую матрицу с помощью glLoadIdentity() и попытаетесь использовать glReadPixels (), glReadPixels () будет работать очень медленно. - person nitrogen; 02.07.2020

Похоже, вы делаете это правильно, но ваша текущая цветовая матрица также устанавливает альфа-значение треугольника на 0, поэтому, пока он рисуется, он не отображается на экране.

person Andrei Krotkov    schedule 25.04.2009
comment
На самом деле, треугольник все еще нарисован в исходном красном, зеленом и синем цветах, поэтому я не верю, что цветовая матрица влияет на альфа-компонент. - person Anthony Johnson; 27.04.2009
comment
альфа-компонент будет влиять на окончательное изображение только в том случае, если включена прозрачность, чего, по-видимому, нет. - person AndyG; 28.04.2009
comment
Я добавил glEnable (GL_BLEND); но это все равно не влияет на картинку. Это по-прежнему красный / зеленый / синий треугольник. Похоже, что цветовая матрица не действует. - person Anthony Johnson; 05.05.2009

«Кроме того, если поддерживается расширение ARB_imaging, также допускается GL_COLOR».

Из документации glMatrixMode. Расширение поддерживается на вашем компьютере?

person Andrei Krotkov    schedule 27.04.2009
comment
Насколько мне известно, ARB_imaging включен, но как узнать? Я использую VS 2008. - person Anthony Johnson; 05.05.2009
comment
Я запустил программу просмотра расширений OpenGL, и она действительно говорит, что GL_ARB_imaging является допустимым расширением на моем компьютере. - person Anthony Johnson; 05.05.2009

Я нашел возможную проблему. Цветовая матрица поддерживается «Подмножеством обработки изображений». В большинстве HW это поддерживалось драйвером. (Программная реализация)

Решение: добавьте эту строку после glEnd():

glCopyPixels(0,0, getWidth(), getHeight(),GL_COLOR);

Это очень медленно ....

person Louis    schedule 11.07.2010