将模型渲染到帧缓冲区

Render model to frame buffer

本文关键字:缓冲区 模型      更新时间:2023-10-16

在OpenGL程序中,我想渲染内存中的所有内容。我不想将数据呈现到窗口/屏幕上。所以我创建了一个帧缓冲区。我想做的下一件事是渲染一个三维模型到帧缓冲区。

我已经下载了Assimp库来处理模型的加载。我只是不知道该怎么处理。它看起来像是希望你把所有东西都直接画到一个窗口上?

我现在想做的就是加载该模型并将其绘制到我的帧缓冲区中。基本上就是这些。

关于如何轻松做到这一点,有什么建议吗?另一个图书馆的提示(可能更适合我的需求)也很受欢迎。

我的代码,我想在哪里绘制到我的帧缓冲区:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); // Bind our frame buffer for rendering
glPushAttrib(GL_VIEWPORT_BIT | GL_ENABLE_BIT); // Push our glEnable and glViewport states
glViewport(0, 0, window_width, window_height); // Set the size of the frame buffer view port
glClearColor (0.0f, 1.0f, 0.0f, 1.0f); // Set the clear colour
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the depth and colour buffers
glLoadIdentity(); // Reset the modelview matrix

// RENDER 3D MODEL HERE....
// TEAPOT AS EXAMPLE
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);
int r = glGetError();
int s = glCheckFramebufferStatus(GL_FRAMEBUFFER);

glPopAttrib(); // Restore our glEnable and glViewport states
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); // Unbind our texture

assimp库只是一个加载程序;它不在乎你是绘制到屏幕外的帧缓冲区还是窗口的后台缓冲区。

请尝试检查glGetErrorglCheckFramebufferStatus的返回代码。

在我的OpenGL程序中,我想渲染内存中的所有内容。我不想将数据呈现到窗口/屏幕上。所以我创建了一个帧缓冲区。我想做的下一件事是渲染一个三维模型到帧缓冲区。

您有OpenGL上下文吗?我看到你在用GLUT。要使用GLUT获取OpenGL上下文,必须创建一个窗口。如果没有OpenGL上下文,就无法创建帧缓冲区对象。

对你来说,这意味着你不能使用GLUT。但这没什么大不了的,因为GLUT只是一个库,很多人认为它是OpenGL的一部分,但事实并非如此。

我建议您使用PBuffer进行屏幕外渲染。在X11/GLX中,这很简单,但在Windows中有点乏味。在Windows中,您需要创建一个代理窗口,以获得第一个扩展加载阶段的中间OpenGL上下文,您需要访问该函数来创建PBuffer;但是,该代理窗口不需要变得可见。请注意,不能使用带有OpenGL上下文的不可见窗口进行屏幕外渲染,因为在这种情况下,像素将无法通过像素所有权测试,因此不会被处理。