2010-04-08 224 views
4

我試圖實現一個老派技術,其中渲染的背景圖像和預設深度信息用於遮擋場景中的其他對象。如何寫入OpenGL深度緩衝區

因此,例如,如果您有一張房間的照片,其中一些電線懸掛在天花板的天花板上,深度貼圖中的深度值會較淺,如果渲染正確,則允許角色「落後」電線,但在房間裏的其他物體前面。

到目前爲止,我已經嘗試創建使用深度紋理:

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, Image.GetWidth(), Image.GetHeight(), 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

然後,只需將它綁定到一個四人間和渲染在屏幕上,但它不從質感寫深度值。

我也試過:

glDrawPixels(Image.GetWidth(), Image.GetHeight(), GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, pixels);

但是這會減慢我的幀率約0.25 FPS ...

我知道,你可以通過設置gl_fragDepth在pixelshader做到這一點到紋理的值,但我想知道如果我能用非像素激活硬件來實現這一點?

+1

我同意GLSL是要走的路。總是令人驚訝的是,這不容易做到。當你交互地改變複雜場景的一小部分時,它非常有用。 – 2010-04-12 06:48:16

回答

0

在試圖獲得深度紋理後,我嘗試了ARB_fragment_program擴展以查看是否可以編寫一個非常簡單(因此廣泛兼容舊硬件)GPU組件片段着色器來完成這個技巧,但是我最終只是決定使用GLSL,因爲ARB_fragment_program擴展名似乎已被棄用,或者至少現在它們的用法是不被接受的。

0

禁止寫入顏色緩衝區(使用:glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE),然後使用適當的Z座標呈現代表「前置」圖像的多邊形。

0

您可以嘗試使用幀緩衝區對象來做你想做的事。

創建fbo1並附加顏色和深度緩衝區。 渲染或設置背景的場景。

創建fbo2並附加顏色和深度緩衝區。

在每次更新時使用幀緩衝區blit以將顏色和深度緩衝區從fbo1 blit到fbo2。

渲染其餘爲fbo2

做fbo2顏色緩衝區的全屏塊傳送到主顯示緩衝區。