【问题标题】:How does glReadPixels works?glReadPixels 是如何工作的?
【发布时间】:2017-03-21 07:59:24
【问题描述】:

我刚刚开始使用 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;
}

【问题讨论】:

  • 我认为 GLUT 应该在创建时为您设置视口,但您是否尝试在创建窗口后手动设置?

标签: opengl glut freeglut


【解决方案1】:

首先你用GL_FLOAT 调用glReadPixels() 但是pixelint[]。此外,您可以使用 GL_RGB 调用它,并且由于您想要 alpha,因此您需要传递 GL_RGBA

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

接下来在printf() 中,你会得到像pixel[4] 这样的alpha,我怀疑这是一个错字,因为你需要这样做pixel[3]。您还可以使用%d 而不是%f

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

最后但同样重要的是,默认情况下 GLUT 不会设置 alpha 缓冲区,您可以通过以下操作进行检查:

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而不是当然。

【讨论】:

    【解决方案2】:

    int pixels[4];改成float pixels[4];,问题应该就解决了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 2019-07-16
      • 2017-07-24
      • 2016-11-13
      • 2017-10-11
      • 2021-10-13
      相关资源
      最近更新 更多