2014-03-19 44 views
0

我正在嘗試爲兩個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時,所有內容都按預期工作

+0

在您的正向傳遞中,是否將深度緩衝區作爲紋理進行綁定,同時還將其附加到FBO? – GuyRT

+0

我綁定我的深度紋理的唯一時間是當我需要在計算着色器通道期間從預處理和正向通道之間讀取數據時。然後,我使用glActivateTextuer(GL_TEXTURE3)和glBindTexture(GL_TEXTURE_2D,m_depthTexture),但在計算着色器完成後,我正好在正向着色器傳遞開始之前使用glBindTexture(GL_TEXTURE_2D,0) – Johan

+0

順便說一下,您不需要在將其附加到'm_forwardColorBuffer'之前再次綁定深度紋理,但正如您所說深度緩衝區看起來被正確填充,我不認爲這是問題所在。 – GuyRT

回答

0

首先,您正確地使用了 layout(location = 0)out vec3 finalColor;

0代表drawBuffer []數組中的索引。很抱歉的錯誤...

更新:

我沒有看到你綁定你的附件插槽,前置通

GLenum DrawBuffers[] = { 
    GL_COLOR_ATTACHMENT4 , GL_COLOR_ATTACHMENT5, GL_DEPTH_ATTACHMENT 
}; 
glDrawBuffers(ARRAY_SIZE_IN_ELEMENTS(DrawBuffers), DrawBuffers); 

另外在預通着色器,你不綁定所有的根據DrawBuffer Array 的附件是否是您的片段着色器爲空?

layout(location = 0)out vec3 color4; 
layout(location = 1)out vec3 color5; 
layout(location = 2)out float fragmentdepth; 

void main() 
{ 
    //output something per fragment!! 
} 

此外,如果你打算使用您的深度紋理作爲輸入到你的着色器,你應該有, 相應的制服,難道我錯了嗎?

+0

啊,感謝您的糾正,我修正了它,但它似乎仍然沒有工作,所以我一定還在做其他的事情。 – Johan

+0

可以顯示TiledForwardPrePass着色器和bindTiledForwardPrePassBuffer嗎? –

+0

我在新的更新中添加了代碼,我只將prepassbuffer作爲drawbuffer進行綁定,並且預着色器只將所有內容寫入深度 – Johan