从后缓冲区读取像素

时间:2012-01-22 01:03:46

标签: c++ opengl

我想从后台缓冲区读取像素。但到目前为止我所得到的只是黑屏(清晰的颜色)。

问题是,我不需要过度吸引窗口。一旦我有像素信息,然后我将它传递给另一个程序,它将为我绘制图像。

我的init函数如下所示:

// No main function, so no real argv argc
char fakeParam[] = "nothing"; 
char *fakeargv[] = { fakeParam, NULL }; 
int fakeargc = 1; 

glutInit( &fakeargc, fakeargv );
GLenum err = glewInit();

if (GLEW_OK != err)
{
    MessageBoxA(NULL, "Failed to initialize OpenGL", "ERROR", NULL);
}
else
{
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);

    // Not sure if this call is needed since i don't use a glut window to render too..
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

}

然后在我的渲染功能中我做:

void DisplayFunc(void)
{
  /* Clear the buffer, clear the matrix */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

  // TEAPOT
  glTranslatef(0.0f, 0.0f, -5.0f); // Translate back 5 units
  glRotatef(rotation_degree, 1.0f, 1.0f, 0.0f); // Rotate according to our rotation_degree value

  glFrontFace(GL_CW);
  glutSolidTeapot(1.0f); // Render a teapot
  glFrontFace(GL_CCW);

  glReadBuffer(GL_BACK);
  glReadPixels(0, 0, (GLsizei)1024, (GLsizei)768, GL_RGB, GL_UNSIGNED_BYTE, pixels);

  int r = glGetError();
}

这基本上就是我所做的一切。在最后一个函数的最后,我正在尝试读取所有像素。但输出只是一个黑色图像。 glGetError()不会给出任何错误。

任何人都知道问题可能是什么...... ???

2 个答案:

答案 0 :(得分:4)

  

我想从后台缓冲区读取像素。但到目前为止我所得到的只是黑屏(清晰的颜色)。

     

问题是,我不需要过度吸引窗口。一旦我有像素信息,然后我将它传递给另一个程序,它将为我绘制图像。

它不起作用。后备缓冲区不是某种屏幕外渲染区域,它是屏幕窗口的一部分。实际上,整个双缓冲概念仅适用于屏幕窗口。双缓冲窗口的每个像素都有两个颜色值,但只有一个深度,模板等;在缓冲交换时,只交换指向后像素平面和前像素平面的指针。但是因为我们还在谈论一个窗口,当栅格化所有片段时,通过像素所有权测试,即检查它们是否在屏幕上实际可见。如果没有,它们就不会被渲染。

但是你的问题更进一步:你甚至没有创建一个窗口,所以根本就没有OpenGL上下文。您对OpenGL命令的调用没有任何效果。 glReadPixels不会给你任何回报,因为没有什么可读的。

坏消息是,通过创建窗口获取GLUT上下文的唯一方法是。好消息是,您不必使用GLUT 。人们,你为什么不明白这一点: GLUT不是OpenGL的一部分,它是编写小教程的快速而肮脏的框架,仅此而已。

你想要的是:

  • 不是一个窗口,而是一个 PBuffer ,即一个不通过像素所有权测试的可屏幕画面。

  • 在其上创建了一个隐藏窗口,其上创建了一个OpenGL上下文,在此上下文中是一个用于屏幕外渲染目标的帧缓冲区对象

答案 1 :(得分:0)

尝试在glFlush之前调用glReadPixels

另外,您在哪里设置窗口大小?