glReadPixels 如何工作?
How does glReadPixels works?
我刚开始使用 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;
}
首先你用 GL_FLOAT
调用 glReadPixels()
但是 pixel
是一个 int[]
。另外你用 GL_RGB
调用它,因为你想要 alpha 你需要传递 GL_RGBA
.
float pixel[4];
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &pixel);
接下来在 printf()
你会得到这样的 alpha pixel[4]
,我怀疑这是一个错字,因为你需要这样做 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
而不是当然。
把int pixels[4];
改成float pixels[4];
,问题应该就解决了。
我刚开始使用 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;
}
首先你用 GL_FLOAT
调用 glReadPixels()
但是 pixel
是一个 int[]
。另外你用 GL_RGB
调用它,因为你想要 alpha 你需要传递 GL_RGBA
.
float pixel[4];
glReadPixels(x, y, 1, 1, GL_RGBA, GL_FLOAT, &pixel);
接下来在 printf()
你会得到这样的 alpha pixel[4]
,我怀疑这是一个错字,因为你需要这样做 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
而不是当然。
把int pixels[4];
改成float pixels[4];
,问题应该就解决了。