2017-03-21 11 views
0

Ich habe gerade mit OpenGL ich begann ein Programm für die Grenze füllen Algorithmus, ich verwendete glClearColor, um die Hintergrundfarbe zu rot ändern, aber wenn ich eine Pixelfarbe mit glReadPixels lesen gibt es RGB-Wert 0,0,0 statt 1 0,0,Wie funktioniert glReadPixels?

#include<stdio.h> 
#include<math.h> 
#include<GL/glut.h> 
#include<GL/freeglut.h> 

int WIDTH=500,HEIGHT=500; 

void boundaryfill(int x, int y) 
{ 
    int pixel[4]; 
    glReadPixels(x,y,1,1, GL_RGB, GL_FLOAT, &pixel); 
    printf("%f %f %f %f\n",pixel[0],pixel[1],pixel[2],pixel[4]); 
    if(pixel[0]==(float)1 && pixel[1]==(float)0 && pixel[2]==(float)0) 
    { 
     printf("njerngwneroingoierngoineriongioerngiernogineiorngoiern"); 
    } 
    else 
    { 
     glBegin(GL_POINTS); 
     glColor3f(0,1,0); 
     glVertex2i(x,y); 
     glEnd(); 
     glFlush(); 
     //boundaryfill(x,y+1); 
     //boundaryfill(x+1,y); 
     //boundaryfill(x,y-1); 
     //boundaryfill(x-1,y); 
    } 
} 

void display() 
{ 
    glClearColor(1.0,0.0,0.0,1.0); 
    glClear(GL_COLOR_BUFFER_BIT); 
    glColor3f(1.0,0.0,0.0); 
    glBegin(GL_LINE_LOOP); 
    glVertex2i(250,250); 
    glVertex2i(-250,250); 
    glVertex2i(-250,-250); 
    glVertex2i(250,-250); 
    glEnd(); 
    boundaryfill(250,250); 
    glFlush(); 
} 

void myinit_func() 
{ 
    glLoadIdentity(); 
    glMatrixMode(GL_PROJECTION); 
    gluOrtho2D(-250,250,-250,250); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowPosition(0,0); 
    glutInitWindowSize(WIDTH,HEIGHT); 
    glutCreateWindow("Boundary fill"); 
    myinit_func(); 
    glutDisplayFunc(display); 

    glutMainLoop(); 
    return 0; 
} 
+0

Ich glaube GLUT sollte das Ansichtsfenster für Sie bei der Erstellung festlegen, aber haben Sie versucht, es nach der Fenstererstellung manuell einzustellen? – SporreKing

Antwort

1

Zunächst einmal rufen Sie glReadPixels() mit GL_FLOAT jedoch pixel ein int[] ist. Zusätzlich rufst du es mit GL_RGB an und da du das Alpha willst, musst du GL_RGBA passieren.

float pixel[4]; 
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &pixel); 

Next in printf() Sie die Alpha-ähnlichen pixel[4], ich vermute, dies ist ein Tippfehler ist, wie Sie pixel[3] tun müssen. Sie verwenden auch %d anstelle von %f.

printf("%f %f %f %f\n", pixel[0], pixel[1], pixel[2], pixel[3]); 

Last but not least, die standardmäßig GLUT nicht Setup ein Alpha-Puffer, die Sie dies überprüfen, indem Sie:

int bits = 0; 
glGetIntegerv(GL_ALPHA_BITS, &bits); 

Um die bits sollte 0 bleiben. Anstatt also müssen Sie glutInitDisplayMode so nennen:

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_ALPHA); 

Beachten Sie, dass in glutInitDisplayMode Sie nicht GLUT_RGBA übergeben müssen, wie es das gleiche wie GLUT_RGB ist. Was zusätzlich Standard ist, kann also entfallen.

Zusätzlich würde ich pixel[0] == (float)1 aufgrund der Gleitkomma-Genauigkeit entmutigen. Ich würde anstelle empfehlen:

GLubyte pixel[4]; 
glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixel); 

printf("%u %u %u %u\n", pixel[0], pixel[1], pixel[2], pixel[3]); 

Dann pixel[0] == 255 statt natürlich tun.

0

Ändern int pixels[4]; zu float pixels[4]; und das Problem sollte behoben werden.

Verwandte Themen