gpt4 book ai didi

c++ - 从后台缓冲区读取像素

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:37 25 4
gpt4 key购买 nike

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

问题是,我不需要过剩的窗口来绘制。获得像素信息后,我会将其传递给另一个程序,该程序将为我绘制图像。

我的初始化函数如下所示:

// 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() 不会给出任何错误。

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

最佳答案

I want to read the pixels from the back buffer. But all i get so far is a black screen (the clear color).

The thing is, is that i don't need a glut window to draw to. Once i have the pixel information, then i pass that to another program which will draw the image for me.

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

但是您的问题更进一步:您甚至没有创建窗口,因此根本没有 OpenGL 上下文。您调用 OpenGL 命令没有任何效果。 glReadPixels 不会返回任何东西,因为没有什么可读的。

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

你想要的是:

  • 不是窗口,而是 PBuffer,即未通过像素所有权测试的屏幕外可绘制对象。

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

关于c++ - 从后台缓冲区读取像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8958145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com