如何在不使用OpenGL在屏幕上显示的情况下渲染到帧缓冲区?

tom*_*234 2 opengl fbo frame

我知道可以离线渲染而不在屏幕上显示.

怎么做,也许吧

创建一个不可见的窗口然后绘制.

渲染时我可以使用特定的fbo吗?

Fle*_*exo 5

您可以使用以下内容创建帧缓冲对象:

GLint fbo, tex; // "handles" for framebuffer and it's texture
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);

// setup texture for colour attachment
glGenTextures(1, &tex);
glEnable(GL_TEXTURE_2D);
glDisable(GL_COLOR_MATERIAL);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// set a size fotr the texture, but not any initial data
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, fbo_resX, fbo_resY, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
// You might want a depth attachment here too perhaps?
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0);

const GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
assert(status == GL_FRAMEBUFFER_COMPLETE_EXT);

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
Run Code Online (Sandbox Code Playgroud)

然后你使用它:

// specify which FBO to use
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
// glDraw...

// return to the default
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
Run Code Online (Sandbox Code Playgroud)

您可以根据需要创建多个帧缓冲区,并在需要时绑定它们.(给予或接受).您需要一个有效的OpenGL上下文来使用它,这通常近似于在大多数平台上创建窗口,但您不必在该窗口中绘制任何内容.