OpenGL Color Matrix - PullRequest
       22

OpenGL Color Matrix

1 голос
/ 26 апреля 2009

Как мне заставить работать преобразования цветовой матрицы 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();

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

Ответы [ 4 ]

6 голосов
/ 08 мая 2009

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

1 голос
/ 27 апреля 2009

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

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

1 голос
/ 26 апреля 2009

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

0 голосов
/ 11 июля 2010

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

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

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

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

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