我正在嘗試爲兩個FBOS使用共享深度紋理,當我進行平鋪前向着色時。我正在做的是一個prez pass,填充深度緩衝區,然後我運行一個計算着色器來做一些calculatons,然後運行我的向前着色器,在那裏我嘗試渲染一個共享該深度緩衝區的FBO,有一個顏色緩衝區。問題是屏幕變黑。以下是我initalize兩個宗教組織:GLSL共享深度緩衝區似乎不工作
void MainWindow::initalizeTiledForwardPrePassBuffer(int width, int height)
{
glGenFramebuffers(1,&m_prePassBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,m_prePassBuffer);
glGenTextures(1,&m_depthTexture);
glGenTextures(1,&m_finalTexture);
// depth
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32F, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
glBindTexture(GL_TEXTURE_2D, m_otherTexture);
///Used to be GL_RGBA only
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGB, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT5, GL_TEXTURE_2D, m_otherTexture, 0);
// final
glBindTexture(GL_TEXTURE_2D, m_finalTexture);
///Used to be GL_RGBA only
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGB, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT4, GL_TEXTURE_2D, m_finalTexture, 0);
GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (Status != GL_FRAMEBUFFER_COMPLETE) {
printf("FB error, status: 0x%x\n", Status);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
void MainWindow::initializeTiledForwardColorBuffer(int width, int height)
{
glGenFramebuffers(1,&m_forwardColorBuffer);
glBindFramebuffer(GL_FRAMEBUFFER,m_forwardColorBuffer);
glGenTextures(1,&m_forwardColorTexture);
glBindTexture(GL_TEXTURE_2D,m_forwardColorTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, width, height, 0, GL_RGB, GL_FLOAT, NULL);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT14, GL_TEXTURE_2D, m_forwardColorTexture, 0);
// depth
glBindTexture(GL_TEXTURE_2D, m_depthTexture);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
GLenum Status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (Status != GL_FRAMEBUFFER_COMPLETE) {
printf("FB error, status: 0x%x\n", Status);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
這裏是我的前ž通:
ShaderMan.useTiledForwardPrePass();
///bind the prepasbuffer for drawing
bindTiledForwardPrePassBuffer();
///enable depth test and clear the buffers and then render the scene
glDepthMask(GL_TRUE);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
//renderSceneToDepth();
renderOtherSceneToDepth();
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
而且直傳
ShaderMan.useForwardShader();
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_forwardColorBuffer);
//glBindImageTexture(4, m_forwardColorTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);
GLenum DrawBuffers[] = {
GL_COLOR_ATTACHMENT14
};
glDrawBuffers(ARRAY_SIZE_IN_ELEMENTS(DrawBuffers), DrawBuffers);
glDepthMask(GL_FALSE);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
//bindMSAABufferForWriting();
bindForForwardPass();
//renderSceneForward();
renderOtherSceneForward();
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBindFramebuffer(GL_READ_FRAMEBUFFER,m_forwardColorBuffer);
glReadBuffer(GL_COLOR_ATTACHMENT14);
glBlitFramebuffer(0, 0, window_width, window_height,
0, 0, window_width, window_height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
我嘗試寫入色緩衝器的方式片段着色器只是用
//Other code.....
layout(location = 0)out vec3 finalColor;
void main()
{
//Other code...
finalColor = vec3(color).xyz;
}
UPDATE
下面是完整的預通着色器 的#Version 430
layout(location = 0)in vec3 position;
uniform mat4 modelViewProjection;
void main()
{
gl_Position = modelViewProjection*vec4(position,1.0f);
}
#version 430
void main()
{
}
我該如何綁定前傳緩衝區
void MainWindow::bindTiledForwardPrePassBuffer()
{
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,m_prePassBuffer);
}
ANSWER
問題顯然是我的圖形卡沒有支持14渲染目標,所以當我將紋理從GL_COLOR_ATTACHMENT14更改爲GL_COLOR_ATTACHMENT1時,所有內容都按預期工作
在您的正向傳遞中,是否將深度緩衝區作爲紋理進行綁定,同時還將其附加到FBO? – GuyRT
我綁定我的深度紋理的唯一時間是當我需要在計算着色器通道期間從預處理和正向通道之間讀取數據時。然後,我使用glActivateTextuer(GL_TEXTURE3)和glBindTexture(GL_TEXTURE_2D,m_depthTexture),但在計算着色器完成後,我正好在正向着色器傳遞開始之前使用glBindTexture(GL_TEXTURE_2D,0) – Johan
順便說一下,您不需要在將其附加到'm_forwardColorBuffer'之前再次綁定深度紋理,但正如您所說深度緩衝區看起來被正確填充,我不認爲這是問題所在。 – GuyRT