OpenGL 帧缓冲区只写入立方体贴图的一个面
OpenGL Framebuffer only writing to one face of cubemap
我似乎只能将我的场景渲染到立方体贴图的一侧。目前一切都是硬编码的,我只是想将相同的场景视图渲染到立方体贴图的 6 个面中,如下所示:
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);
根据我给 glFramebufferTexture2D() 的“GL_TEXTURE_CUBE_MAP_..._.”值,它总是将场景渲染成那一张脸——好像不是根据循环中 "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个相关案例,但均未解决
你只有一个深度缓冲区。由于您将完全相同的渲染到每个面孔中,并假设默认的 glDepthFunc()
比较模式 GL_LESS
,因此在第一次迭代后生成的所有片段都将无法通过深度测试。
您需要在循环中清除深度缓冲区。可能需要也可能不需要清除颜色缓冲区,具体取决于您绘制场景的方式。
我似乎只能将我的场景渲染到立方体贴图的一侧。目前一切都是硬编码的,我只是想将相同的场景视图渲染到立方体贴图的 6 个面中,如下所示:
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);
根据我给 glFramebufferTexture2D() 的“GL_TEXTURE_CUBE_MAP_..._.”值,它总是将场景渲染成那一张脸——好像不是根据循环中 "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个相关案例,但均未解决
你只有一个深度缓冲区。由于您将完全相同的渲染到每个面孔中,并假设默认的 glDepthFunc()
比较模式 GL_LESS
,因此在第一次迭代后生成的所有片段都将无法通过深度测试。
您需要在循环中清除深度缓冲区。可能需要也可能不需要清除颜色缓冲区,具体取决于您绘制场景的方式。