我刚刚开始使用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;
}
答案 0 :(得分:1)
首先,您使用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]
这样的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
而不是当然。
答案 1 :(得分:0)
将int pixels[4];
更改为float pixels[4];
,问题应该得到解决。