Как работает glReadPixels?

Я только начал использовать OpenGL, я писал программу для алгоритма заполнения границ, я использовал glClearColor, чтобы изменить цвет фона на красный, но когда я читаю цвет пикселя, используя glReadPixels, он дает значение RGB 0,0,0 вместо 1,0 ,0

#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;
}

person Aadi    schedule 21.03.2017    source источник
comment
Я считаю, что GLUT должен установить для вас окно просмотра при создании, но вы пытались установить его вручную после создания окна?   -  person SporreKing    schedule 21.03.2017


Ответы (2)


Прежде всего, вы вызываете glReadPixels() с GL_FLOAT, однако pixel является int[]. Кроме того, вы вызываете его с помощью GL_RGB, и, поскольку вам нужна альфа-версия, вам нужно передать GL_RGBA.

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

Далее в printf() вы получаете вот такую ​​альфу pixel[4], подозреваю, что это опечатка, так как нужно сделать pixel[3]. Вы также используете %d вместо %f.

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

И последнее, но не менее важное: по умолчанию GLUT не устанавливает альфа-буфер, что вы можете проверить, выполнив следующие действия:

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

До которого bits должно остаться 0. Поэтому вместо этого вам нужно вызвать glutInitDisplayMode следующим образом:

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_ALPHA);

Обратите внимание, что в glutInitDisplayMode вам не нужно передавать GLUT_RGBA, так как это то же самое, что и GLUT_RGB. Что также является значением по умолчанию, поэтому его можно опустить.

Кроме того, я бы не рекомендовал делать pixel[0] == (float)1 из-за точности с плавающей запятой. Вместо этого я бы рекомендовал использовать:

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

Затем делаем pixel[0] == 255 вместо курса.

person vallentin    schedule 21.03.2017

Измените int pixels[4]; на float pixels[4];, и проблема должна быть решена.

person SporreKing    schedule 21.03.2017