glReadPixels 不更新值
Posted
技术标签:
【中文标题】glReadPixels 不更新值【英文标题】:glReadPixels not updating the value 【发布时间】:2016-03-07 02:55:29 【问题描述】:glReadPixels 不会在我画出一个点后立即更新。
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
printf("after coloring %d %d %d\n", (int)pixel[0], (int)pixel[1] , (int)pixel[2]);
pixel[0]
、pixel[1]
和 pixel[2]
的值将为零,而预期值为 255, 0, 0
。帮我解决这个问题:)
【问题讨论】:
能否显示像素类型? 像素应该是咬合类型你确定你在它的声明中得到了正确的类型吗? 您确定您的x,y
对应于屏幕(0,0)
吗?记住变换矩阵...屏幕左上角是图像原点,那么您的点是否呈现在那里?
【参考方案1】:
这可能是由于许多问题
模型到 NDC 空间的转换未设置为生成从顶点坐标到像素位置的 1:1 映射
您确实尝试设置这样的转换,但由于舍入误差和 OpenGL 像素中心有点不直观(从数学上讲,它们是有道理的),您的点最终位于相邻像素中
读取缓冲区未设置为您要绘制到的缓冲区(glDrawBuffer、glReadBuffer)
发布您的完整代码,我们能够重现并进一步帮助您。
【讨论】:
【参考方案2】:我没有看到所有代码,但我想问题可能是你的 x 和 y 这是一个浮点值 glVertex2f(x,y);
和 x 和 y 小于 1 但 glReadPixels
使用 int 参数并在从float 到 int 它从我们想要读取的信息中获取不正确的像素坐标值,因此如果您想使用真实像素坐标,您可以使用 glOrtho
(更多信息可以在 here 中找到)例如窗口高度 = 500 和宽度 = 500:
void Display(void)
glClear(GL_COLOR_BUFFER_BIT);
//Rectangles();
glMatrixMode(GL_PROJECTION);
glOrtho(0, 500, 0, 500, -1, 1);
// Restore the default matrix mode
glColor3f(1.0f, 0.0f, 0.0f);
float x = 50, y = 50;
unsigned char pixel[3];
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glMatrixMode(GL_MODELVIEW);
glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
printf("after coloring %d %d %d\n", (int)pixel[0], (int)pixel[1] , (int)pixel[2]);
glFlush();
【讨论】:
以上是关于glReadPixels 不更新值的主要内容,如果未能解决你的问题,请参考以下文章