首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从后台缓冲区读取像素

从后台缓冲区读取像素
EN

Stack Overflow用户
提问于 2012-01-22 09:03:46
回答 2查看 4K关注 0票数 3

我想从后台缓冲区中读取像素。但到目前为止,我看到的只是一个黑色的屏幕(清晰的颜色)。

问题是,我不需要一个过多的窗口来画画。一旦我有了像素信息,然后我将其传递给另一个程序,该程序将为我绘制图像。

我的init函数如下所示:

代码语言:javascript
复制
// 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);

}

然后在我的渲染函数中,我会这样做:

代码语言:javascript
复制
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()不会给出任何错误。

有没有人知道问题出在哪里...?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-22 19:41:16

我想从后台缓冲区中读取像素。但到目前为止,我看到的只是一个黑色的屏幕(清晰的颜色)。

问题是,我不需要一个过多的窗口来画画。一旦我有了像素信息,然后我将其传递给另一个程序,该程序将为我绘制图像。

它不是那样工作的。后台缓冲区不是某种屏幕外渲染区域,它是屏幕上窗口的一部分。实际上,整个双缓冲区概念只对屏幕上的窗口有意义。双缓冲窗口的每个像素有两个颜色值,但只有一个深度、模板等;在缓冲区交换时,仅交换指向前后像素平面的指针。但因为我们仍然在讨论窗口,当光栅化所有片段时,都会通过像素所有权测试,即如果它们在屏幕上确实可见,则会进行检查。如果不是,它们就不会被渲染。

但是您的问题更深一层:您甚至没有创建窗口,所以根本没有OpenGL上下文。您对OpenGL命令的调用没有任何影响。glReadPixels不会返回任何内容,因为没有任何内容可供读取。

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

你想要的是:

  • 不是一个窗口,而是一个PBuffer,即无法通过像素所有权测试的屏幕外可绘制图形。

  • 具有在其上创建的OpenGL上下文的隐藏窗口,并且在此上下文中是用于屏幕外呈现目标的帧缓冲区对象。
票数 4
EN

Stack Overflow用户

发布于 2012-01-22 09:11:05

尝试在glReadPixels之前调用glFlush

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8958145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档