opengl如何获取一点的像素

GLint iPixel = 0;
glReadBuffer(GL_FRONT);
glReadPixels(xi, point.y, 1, 1, GL_RED, GL_UNSIGNED_INT, &iPixel);//读取一点的红色通道值
cerr < < iPixel;
我这样写输出的不对,总是0,还要什么设置么?
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
这个也设置了
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(640, 480);
glutInitWindowPosition(100, 150);
glutCreateWindow("my first attempt");

glutDisplayFunc(myDisplay);

myInit();
glutMainLoop();

return 0;
}
void myInit(void)
{
glClearColor(1.0, 1.0, 1.0, 0.0);
glPointSize(1.0);//设置点的大小为一个像素
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}
void myDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
DrawRegion();
RegionFill();
glFlush();
}
我犯了这个错误 GL_INVALID_OPERATION is generated if glReadPixels is executed between the execution of glBegin and
the corresponding execution of glEnd.
谢谢指导,现在读取的数值还是不对,我设置背景是白色的,然后就画了几条线组成的区域,但我读取没在线上的点的数值也是0,这个值有时候还会有231这数字
最新回答
一枝沈荼

2024-06-23 11:56:18

一个一个像素的读写太慢了吧, opengl只支持一堆像素的读写。
void glReadPixels();
glDrawPixels();
当然你用他们来读写一个像素也可以.只不过有点大材小用

void glReadPixels(GLint x,GLint y,GLsizesi width,GLsizei height,
GLenum format,GLenum type,GLvoid *pixel);

函数参数(x, y)定义图像区域左下角点的坐标,width和height分别是图像的高度和宽度,*pixel是一个指针,指向存储图像数据的数组。参数format指出所读象素数据元素的格式(索引值或R、G、B、A值,如下面表所示),而参数type指出每个元素的数据类型(也见下面表)。
写入象素数据:

void glDrawPixels(GLsizesi width,GLsizei height,GLenum format,
GLenum type,GLvoid *pixel);

函数参数format和type与glReadPixels()有相同的意义,pixel指向的数组包含所要画的象素数据。注意,调用这个函数前必须先设置当前光栅位置,若当前光栅位置无效,则给出该函数时不画任何图形,并且当前光栅位置仍然保持无效。

+++++++++++像素格式表++++++++++++++++++++++
GL_INDEX 单个颜色索引
GL_RGB 先是红色分量,再是绿色分量,然后是蓝色分量
GL_RED 单个红色分量
GL_GREEN 单个绿色分量
GL_BLUE 单个蓝色分量
GL_ALPHA 单个Alpha值
GL_LUMINANCE_ALPHA 先是亮度分量,然后是Alpha值
GL_STENCIL_INDEX 单个的模板索引
GL_DEPTH_COMPONENT 单个深度分量
++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++ 数据类型+++++++++++++++++++
GL_UNSIGNED_BYTE 无符号的8位整数
GL_BYTE 8位整数
GL_BITMAP 无符号的8位整数数组中的单个数位
GL_UNSIGNED_SHORT 无符号的16位整数
GL_SHORT 16位整数
GL_UNSIGNED_INT 无符号的32位整数
GL_INT 32位整数
GL_FLOAT 单精度浮点数
+++++++++++++++++++++++++++++++++++++++

图像的每个元素按上面表给出的数据类型存储。若元素表示连续的值,如红、绿、蓝或亮度分量,每个值都按比例放缩使之适合于可用的位数。例如,红色分量是0.0到1.0之 间的浮点值。若它需要放到无符号单字节整数中,也仅有8位精度保存下来,其他无符号整数类型同理。对于有符号的数据类型还要少一位,例如颜色索引存到有符号的8位整数中,它的第一位被0xfe屏蔽掉了(即这个掩码包含7个1)。若类型是GL_FLOAT,索引值简单地转化成单精度浮点值,例如索引17转化成17.0,同理。
笑死大姨妈

2024-06-23 02:55:53

建议你检查一下glReadPixels的返回值
你给的代码比较少,没办法保证前面的代码没问题

int ret=glGetError();
cout<<ret<<endl;

我要看看这个ret的值

不好意思,打错了

===============================
gl.h里面有定义
#define GL_NO_ERROR 0
#define GL_INVALID_ENUM 0x0500
#define GL_INVALID_VALUE 0x0501
#define GL_INVALID_OPERATION 0x0502
#define GL_STACK_OVERFLOW 0x0503
#define GL_STACK_UNDERFLOW 0x0504
#define GL_OUT_OF_MEMORY 0x0505

你的绘图操作会改变缓冲区的颜色的嘛;
ミ猫田喂山风

2024-06-23 03:05:23

之前先用glPixelStore指定像素编码方式吧
我也不太确定