Hi, I’ve an FBO class and I want to render the faces of a cubemap texture, I saw a vidéo tutorial when he does it :
https://www.youtube.com/watch?v=lW_iqrtJORc&t=799s
But when I call glFramebufferTexture2D opengl return me an INVALID_ENUM.
Here is the code when I create the FBO :
////////////////////////////////////////////////////////////
RenderTextureImplFBO::RenderTextureImplFBO() :
m_frameBuffer(0),
m_depthBuffer(0)
{
}
////////////////////////////////////////////////////////////
RenderTextureImplFBO::~RenderTextureImplFBO()
{
// Destroy the depth buffer
if (m_depthBuffer)
{
GLuint depthBuffer = static_cast<GLuint>(m_depthBuffer);
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glDeleteRenderbuffers(1, &depthBuffer));
else
glCheck(glDeleteRenderbuffersEXT(1, &depthBuffer));
}
// Destroy the frame buffer
if (m_frameBuffer)
{
GLuint frameBuffer = static_cast<GLuint>(m_frameBuffer);
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glDeleteFramebuffers(1, &frameBuffer));
else
glCheck(glDeleteFramebuffersEXT(1, &frameBuffer));
}
//delete m_context;
}
////////////////////////////////////////////////////////////
bool RenderTextureImplFBO::isAvailable()
{
// Make sure that GLEW is initialized
priv::ensureGlewInit();
return GLEW_EXT_framebuffer_object != 0;
}
////////////////////////////////////////////////////////////
bool RenderTextureImplFBO::create(unsigned int width, unsigned int height, window::ContextSettings settings, unsigned int textureId, bool selectCubemapFace)
{
//window::GLResource::TransientContextLock transientLock();
//m_context = new window::Context(m_settings, m_width, m_height);
// Create the framebuffer object
GLuint frameBuffer = 0;
m_versionMajor = settings.versionMajor;
m_versionMinor = settings.versionMinor;
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glGenFramebuffers(1, &frameBuffer));
else
glCheck(glGenFramebuffersEXT(1, &frameBuffer));
m_frameBuffer = static_cast<unsigned int>(frameBuffer);
if (!m_frameBuffer)
{
std::cerr << "Impossible to create render texture (failed to create the frame buffer object)" << std::endl;
return false;
}
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer));
else
glCheck(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_frameBuffer));
// Create the depth buffer if requested
if (settings.depthBits > 0)
{
GLuint depth = 0;
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glGenRenderbuffers(1, &depth));
else
glCheck(glGenRenderbuffersEXT(1, &depth));
m_depthBuffer = static_cast<unsigned int>(depth);
if (!m_depthBuffer)
{
std::cerr << "Impossible to create render texture (failed to create the attached depth buffer)" << std::endl;
return false;
}
if (m_versionMajor >= 3 && m_versionMinor >= 3) {
glCheck(glBindRenderbuffer(GL_RENDERBUFFER, m_depthBuffer));
glCheck(glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height));
glCheck(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthBuffer));
} else {
glCheck(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthBuffer));
glCheck(glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, width, height));
glCheck(glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthBuffer));
}
}
glCheck(glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT));
//if (!selectCubemapFace) {
if (m_versionMajor >= 3 && m_versionMinor >= 3) {
glCheck(glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, textureId, 0));
} else {
// Link the texture to the frame buffer
glCheck(glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, textureId, 0));
}
if (m_versionMajor >= 3 && m_versionMinor >= 3) {
// A final check, just to be sure.
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
{
glCheck(glBindFramebuffer(GL_FRAMEBUFFER, 0));
std::cerr << "Impossible to create render texture (failed to link the target texture to the frame buffer)" << std::endl;
return false;
}
} else {
// A final check, just to be sure...
if (glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT) != GL_FRAMEBUFFER_COMPLETE_EXT)
{
glCheck(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
std::cerr << "Impossible to create render texture (failed to link the target texture to the frame buffer)" << std::endl;
return false;
}
}
//}
return true;
}
//bool RenderTextureImplFBO::activate(bool active) {
/*if (!m_context)
m_context = new window::Context(m_settings, m_width, m_height);*/
//return m_context->setActive(active);
//}
////////////////////////////////////////////////////////////
void RenderTextureImplFBO::updateTexture(unsigned int)
{
glFlush();
}
unsigned int RenderTextureImplFBO::getFramebufferId () {
return m_frameBuffer;
}
void RenderTextureImplFBO::bind() {
glCheck(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_frameBuffer));
}
void RenderTextureImplFBO::selectCubemapFace (int face, int textureID) {
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glBindFramebuffer(GL_FRAMEBUFFER, m_frameBuffer));
else
glCheck(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_frameBuffer));
if (m_versionMajor >= 3 && m_versionMinor >= 3)
glCheck(glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, textureID, 0));
else
glCheck(glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0,GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, textureID, 0));
}
}
What’s wrong ?
SOLVED ERROR OF MY PART SORRY