我似乎只能将我的场景渲染到立方体贴图的一侧。在一切都硬编码的那一刻,我只是想渲染场景相同的观点到每个立方体贴图的6个面的,就像这样:OpenGL Framebuffer只写入立方体贴图的一张脸
glBindFramebuffer(GL_FRAMEBUFFER, m_FboId);
glViewport(0, 0, CUBEMAP_SIZE, CUBEMAP_SIZE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
shader.bind();
shader.loadProjectionMtx(glm::perspective(90.0f, 1.0f, 0.001f, 300.0f)[0][0]);
shader.loadViewMtx(glm::lookAt(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f))[0][0]);
for (unsigned int f = 0; f < 6; f++)
{
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X + f, m_glId, 0);
for (unsigned int i = 0; i < entities.size(); i++)
{
// Rendering the scene like normal
}
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
根据什么“GL_TEXTURE_CUBE_MAP_ .. “__”value我给glFramebufferTexture2D()它总是将场景渲染到那一张脸上 - 就像它不会根据循环中的“f”的值来交换要呈现的脸部。
但是,一个渲染到的立方体面总是呈现正确的。
这里的立方体贴图& FBO创建代码:
glGenFramebuffers(1, &m_FboId);
glBindFramebuffer(GL_FRAMEBUFFER, m_FboId);
glGenTextures(1, &m_TxId);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_TxId);
for (unsigned int i = 0; i < 6; i++)
{
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, CUBEMAP_SIZE, CUBEMAP_SIZE, 0, GL_RGB, GL_UNSIGNED_BYTE, (void*)nullptr);
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glGenRenderbuffers(1, &m_DepthId);
glBindRenderbuffer(GL_RENDERBUFFER, m_DepthId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, CUBEMAP_SIZE, CUBEMAP_SIZE);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_TxId, 0);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_DepthId);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
int fbo_Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (fbo_Status != GL_FRAMEBUFFER_COMPLETE) printf(" ::ENGINE:: FBO Creation Failed! glError: %i\n", fbo_Status);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我已经找到2其他相关案件的在线但是没有得到解决
我认为你应该用'GL_TEXTURE_CUBE_MAP_POSITIVE_X'替换'GL_TEXTURE_CUBE_MAP_NEGATIVE_X' ,因为它是第一个立方体贴图。 – SurvivalMachine
'glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D,m_TxId,0);'这行应该给出错误,因为'm_TxId'不是2D纹理。这是一个立方体贴图纹理。 –
嘿尼科尔,谢谢我已经从fbo初始化代码中删除了glFramebufferTexture2D()行,无论如何它是不必要的,仍然只有一个面被渲染到:( – HelloWorldCpp