在我的OpenGL程序中,我希望将所有内容呈现在内存中。我不想将数据渲染到窗口/屏幕。所以我创建了一个帧缓冲区。我想要做的下一件事是将3d模型渲染到该帧缓冲区。
我已经下载了Assimp库来处理模型的加载。我只是不确定如何使用它。看起来它希望你把所有东西直接画到窗口上?
我现在要做的就是将该模型加载并绘制到我的Frame Buffer中。这基本上都是。
有关如何轻松完成此操作的任何提示/建议?另外一个图书馆的提示(可能更适合我的需求)也是受欢迎的。
我的代码,我想要绘制到我的帧缓冲区:
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
答案 0 :(得分:1)
assimp库只是一个装载器;它不关心你是否绘制到屏幕外的帧缓冲区或窗口的后备缓冲区。
尝试检查 glGetError 和 glCheckFramebufferStatus 的返回代码。
答案 1 :(得分:0)
在我的OpenGL程序中,我希望将所有内容呈现在内存中。我不想将数据渲染到窗口/屏幕。所以我创建了一个帧缓冲区。我想要做的下一件事是将3d模型渲染到该帧缓冲区。
你有OpenGL上下文吗?我看到你正在使用GLUT。要使GLUT获得OpenGL上下文,您必须创建一个窗口。如果没有OpenGL上下文,则无法创建帧缓冲区对象。
对您而言,这意味着您无法使用GLUT。但这没什么大不了的,因为GLUT只是一些库,很多人认为它是OpenGL不可或缺的东西,但事实并非如此。
我建议您使用PBuffer进行屏幕外渲染。在X11 / GLX中,这很简单,但在Windows中有点乏味。在Windows中,您需要创建一个代理窗口,以获得第一个扩展加载阶段的中间OpenGL上下文,您需要访问该函数来创建一个PBuffer;但是,该代理窗口不需要变得可见。请注意,您不能将具有OpenGL上下文的不可见窗口用于屏幕外渲染,因为在这种情况下,像素将不会通过像素所有权测试,因此不会被处理。