2012-08-30 179 views
1

我遇到深度緩衝區問題。我想投入一個紋理。但它似乎並不奏效。OpenGL深度緩衝區紋理(針對各種圖像大小)

所以,這裏的一段代碼,我執行渲染對象後:

glGenTextures(1, (GLuint*)&_depthTexture); 
    glBindTexture(GL_TEXTURE_2D, _depthTexture); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 

    const pair<int, int> &img_size = getImageSize(); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, img_size.first, img_size.second, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); 
    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, img_size.first, img_size.second); 

    glClear(GL_DEPTH_BUFFER_BIT); 

的事情是(我用OpenGL 3.2以上版本),用於渲染的圖像有不同的尺寸。大多數情況下,大小不會超過2^j。那麼,這是一個問題嗎?

而且,問題的另一部分可能是在片段着色器後:

#version 140 

uniform sampler2D depthTexture; 
uniform ivec2 screenSize; 

out vec4 outColor; 

void main() 
{ 
    vec2 depthCoord = gl_FragCoord.xy/screenSize.xy; 
    float d = texture2D(depthTexture, depthCoord).x; 
    outColor = vec4(d, d, d, 1.0); 
} 

之後,當我使第二次一些的形狀,我想用以前的深度(紋理深度緩衝區),做一些效果。

但嚴重......任何人都可以告訴我一段代碼,您可以將深度緩衝區放入紋理中?我不在乎它是渲染到紋理還是紋理在渲染之後被提取出來!只要我具有深度值的紋理來完成第二遍......這就是重要的!

+0

「它以什麼方式不起作用? –

+0

我的形象是黑色的!而根據其他網站,深度緩衝區應該看起來是白色,當它遠近黑色時......但是我的一半圖像應該是白色的......至少是新三角形覆蓋的部分! – widgg

+0

「深度緩衝區應該看起來像是白​​色,當它遠離黑色並且靠近黑色時」這取決於存儲在那裏的內容。如果您使用默認的深度範圍,那麼這將是真實的。 –

回答

1

您可能需要撥打glReadBuffer。如果你的上下文是雙緩衝的,那將是glReadBuffer(GL_BACK)

此外,嘗試GL_DEPTH_COMPONENT24,因爲我認爲32位深度緩衝區是不尋常的。

+0

32位深度不是特別罕見,它是一個常規大小的浮點數(儘管也存在32位int緩衝區格式)。 24位實際上不太常見,是卡片速度不足以完成32位整數的時間的剩餘部分,但16位對於渲染來說不夠準確。那時,一些驅動程序會使用24位來代替32位;它現在往往是相反的。 – ssube

+0

@peachykeen:32位浮點深度緩衝區*不常見。此外,'DEPTH_COMPONENT32'是一個*規範化的整數*深度緩衝區,而不是浮點數(即'DEPTH_COMPONENT32F') –

+0

這是一個很好的問題......但它可能是雙緩衝的!我只是不確定。 – widgg