2009-04-25 6 views
1

Wie bekomme ich die OpenGL-Farbmatrix-Transformationen zum Laufen?OpenGL-Farbmatrix

Ich habe ein Beispielprogramm geändert, das nur ein Dreieck zeichnet und einen Farbmatrixcode hinzugefügt, um zu sehen, ob ich die Farben des Dreiecks ändern kann, aber es scheint nicht zu funktionieren.

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(); 

Soweit ich sagen kann, ist die Farbmatrix I Laden bin sollte das Dreieck schwarz ändern, aber es scheint nicht zu funktionieren. Gibt es etwas, das mir fehlt?

Antwort

6

Die Farbmatrix gilt nur für Pixelübertragungsoperationen wie z. B. glDrawPixels, die auf der aktuellen Hardware nicht hardwarebeschleunigt sind. Die Implementierung einer Farbmatrix mit einem Fragment-Shader ist jedoch sehr einfach. Sie können einfach Ihre Matrix als uniform mat4 übergeben, dann multiply es mit gl_FragColor

1

Es sieht so aus, als ob Sie es richtig machen, aber Ihre aktuelle Farbmatrix setzt den Alpha-Wert des Dreiecks ebenfalls auf 0, so dass es während des Zeichnens nicht auf dem Bildschirm erscheint.

+0

Eigentlich noch das Dreieck gezeichnet in seinem ursprünglichen Rot, Grün und Blau, so glaube ich nicht, dass die Farbmatrix die Alpha-Komponente beeinflusst. –

+0

Die Alphakomponente wirkt sich nur auf das endgültige Bild aus, wenn Transparenz aktiviert ist, was offensichtlich nicht der Fall ist. – AndyG

+0

Ich habe ein glEnable (GL_BLEND) hinzugefügt; aber es hat immer noch keinen Einfluss auf das Bild. Es ist immer noch ein rot/grün/blaues Dreieck. Es scheint, dass die Farbmatrix keine Wirkung hat. –

1

"Wenn die Erweiterung ARB_imaging unterstützt wird, wird auch GL_COLOR akzeptiert."

Aus der glMatrixMode-Dokumentation. Wird die Erweiterung auf Ihrem Computer unterstützt?

+0

Soweit ich weiß, ARB_imaging ist aktiviert, aber wie finde ich heraus? Ich verwende VS 2008. –

+0

Ich habe den OpenGL Extensions Viewer ausgeführt, und es heißt, dass GL_ARB_imaging eine gültige Erweiterung auf meinem Computer ist. –

0

Ich habe das mögliche Problem gefunden. Die Farbmatrix wird vom "Image Processing Subset" unterstützt. In den meisten HW wurde es von Treiber unterstützt (Software-Implementierung)

. Lösung: diese Zeile hinzufügen nach glEnd():

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

Es ist sehr langsam ....