Я пытаюсь сделать рендеринг в кубическую карту, чтобы создать динамический скайбокс. И я пытаюсь сделать это с помощью функции прямого доступа к состоянию из OpenGL 4.5.
Я понял идею простой 2D-текстуры для рендеринга за пределами экрана.
Вот как я это делаю. Я вставляю только минимальный и эффективный код.
// 1. Initialization code
{
// FBO (Frame Buffer Object)
GLuint FBO;
glCreateFramebuffers(1, &FBO);
// Texture2D for color buffer
{
GLuint colorBuffer;
glCreateTextures(GL_TEXTURE_2D, 1, &colorBuffer);
glTextureStorage2D(colorBuffer, 1, GL_RGB8, 1024, 1024);
glNamedFramebufferTexture(FBO, GL_COLOR_ATTACHMENT0, colorBuffer, 0);
}
// RBO (Render Buffer Object) for depth buffer.
{
GLuint depthBuffer;
glCreateRenderbuffers(1, &depthBuffer);
glNamedRenderbufferStorage(depthBuffer, GL_DEPTH_COMPONENT24, 1024, 1024);
glNamedFramebufferRenderbuffer(FBO, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthBuffer);
}
if ( glCheckNamedFramebufferStatus(m_identifier, GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE )
exit(1);
}
// 2. Drawing code
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, FBO);
glClearNamedFramebufferfv(FBO, GL_COLOR, 0, m_clearColor.data());
glClearNamedFramebufferfv(FBO, GL_DEPTH, 0, &m_clearDepth);
// Draw stuffs ...
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
Итак, для рендеринга в кубическую карту моя идея состоит в том, чтобы заменить "GL_TEXTURE_2D" на "GL_TEXTURE_CUBEMAP". Я знаю, что мне нужно продолжать использовать glTextureStorage2D () для создания хранилища.
Тогда я не знаю, будет ли RBO обрабатывать рендеринг кубической карты ... Я думаю использовать его повторно для каждого лица.
И, наконец, я полностью потерян с рендером. По крайней мере, я знаю, что мне нужно 6 раз отрендерить сцену с другим углом камеры, чтобы завершить куб. Но я не знаю, как сказать OpenGL, с каким лицом я на самом деле рендеринг.
Один из моих первых подсказок - использовать "glNamedFramebufferDrawBuffer (FBO, GL_COLOR_ATTACHMENT0 + face)", но это не работает.
Я видел другое решение при создании буфера кадров с помощью glNamedFramebufferTextureLayer (), но я не уверен, правильно ли это.
Я искал решение в Интернете, но я нашел много способов сделать это, некоторые не совместимы с DSA.
Есть ли кто-то, кто достигнет этого? Мне просто нужна основная идея.