Как выполнить рендеринг в буфер кадров без отображения на экране с помощью OpenGL?

#opengl #frame #fbo

#opengl #фрейм #fbo

Вопрос:

Я знал, что можно выполнять рендеринг в автономном режиме, не отображая его на экране.

Как это сделать, может быть

создайте невидимое окно, затем нарисуйте.

Могу ли я использовать определенный fbo при рендеринге?

Ответ №1:

Вы можете создать объект framebuffer, используя что-то вроде:

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

// setup texture for colour attachment
glGenTextures(1, amp;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);
  

Затем вы используете его как:

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

// return to the default
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  

Вы можете создавать несколько фреймбуферов по своему усмотрению и привязываться к ним, когда вам заблагорассудится. (Плюс-минус). Для этого вам понадобится действительный контекст OpenGL, что обычно соответствует созданию окна на большинстве платформ, но вам никогда не придется ничего рисовать в этом окне.

Ответ №2:

Для этого вы можете использовать простой DirectMedia Layer (SDL).