我正在尝试使用 OpenGL 来帮助处理 Kinect 深度图输入到图像中。目前,我们使用 Kinect 作为基本的运动传感器,程序会计算有多少人经过并在每次检测到新人时进行屏幕截图。

问题是我需要让这个程序在不访问显示器的情况下运行。我们希望通过 SSH 远程运行它,而来自其他服务的网络流量对于 X11 转发来说将是一个好主意。将显示器连接到运行程序的机器上是可能的,但出于能源消耗的原因,我们希望避免这样做。

该程序确实为 OpenGL 生成了一个 2D 纹理对象,并且通常只使用 GLUT 来渲染它,然后再读取像素并使用 FreeImage 将它们输出到 .PNG 文件。我遇到的问题是,一旦删除了 GLUT 函数调用,打印到 .PNG 文件的所有内容都只是黑框。

我正在为 Kinect 使用 OpenNI 和 NITE 驱动程序。编程语言是C++,由于目标设备的硬件限制,我需要使用Ubuntu 10.04。

我试过使用 OSMesa 或 FrameBuffer 对象,但我是一个完整的 OpenGL 新手,所以我没有让 OSMesa 正确渲染来代替 GLUT 函数,而且我的编译器在 GL/中找不到任何 OpenGL FrameBuffer 函数glext.h 或 GL/gl.h。

我知道纹理可以从图像文件读入程序,我想要输出的只是一个二维纹理。在这种情况下,有没有办法跳过离屏渲染的麻烦,直接将纹理打印到图像文件中,而无需 OpenGL 先渲染它?

最佳答案

OSMesa 库既不是 GLUT 的直接替代品,也不能协同工作。如果您只需要没有交互的屏幕外渲染部分,您必须自己实现一个简单的事件循环。

例如:

/* init OSMesa */
OSMesaContext        mContext;
void                *mBuffer;
size_t               mWidth;
size_t               mHeight;

// Create RGBA context and specify Z, stencil, accum sizes
mContext = OSMesaCreateContextExt( OSMESA_RGBA, 16, 0, 0, NULL );
OSMesaMakeCurrent(mContext, mBuffer, GL_UNSIGNED_BYTE, mWidth, mHeight);

截断后,您可以使用普通的 OpenGL 调用进行渲染,在 glFinish() 调用之后,可以通过 mBuffer 指针访问结果。

在您的事件循环中,您可以调用正常的 onDisplay、onIdle 等回调。

关于c++ - 将 OpenGL 纹理打印到文件而不显示?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8434633/

10-11 23:12
查看更多