2013-10-04 32 views
0

我正在爲移動平臺開發遊戲,我想將我的效果渲染到比屏幕更低分辨率的渲染目標。問題是,我需要從全屏幕的深度緩衝區開始。是否可以在沒有GL_OES_depth_texture的情況下對OpenGL ES深度緩衝區進行縮減採樣?

如果硬件支持GL_OES_depth_texture,我想這將是相對直接的,但不幸的是我不這樣做,所以我想知道是否有任何其他方式從全屏渲染獲取深度信息並將其用於我的較低分辨率渲染。

如果我實際上不能對渲染緩衝區進行下采樣,我可以將較高分辨率的深度緩衝區綁定到具有較低分辨率顏色緩衝區的渲染目標上嗎?我找不到任何說明幀緩衝區對象的所有不同附件的分辨率必須與分辨率相匹配的文檔,但我強烈懷疑這是一項要求。

感謝您的幫助!

+0

在OpenGL ES 2.0中,您不能在幀緩衝區對象中的附件之間混合匹配分辨率(非常類似於GL_EXT_framebuffer_obect)。在桌面GL(GL3 /'GL_ARB_framebuffer_object')中是可能的,但是在GLES2中它會創建一個幀緩衝區不完整的錯誤。如果你知道在哪裏看,它**實際上是記錄的,參見['glCheckFramebufferStatus(...)'](http://www.khronos.org/opengles/sdk/docs/man/xhtml/glCheckFramebufferStatus.xml ) - 'GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS' –

+0

謝謝指出!我不會想到在那裏......如果我沒有GL_OES_depth_texture擴展名,有什麼辦法可以downrez一個深度緩衝區? – ItsLikeYouKnowWhatever

回答

1

我認爲你應該渲染到一個附加到FBO的紋理。紋理可以有任何你想要的較低分辨率。在大多數平臺上,紋理實際上是唯一在OpenGL ES 1.1和2.0中非常有用的FBO附件。

謝謝安東。

Andon在暗示的是,您可以使用OpenGL ES 2.0可以理解的普通GL_RGBA格式渲染紋理,但以更高效的方式打包/編碼顏色。如果您只使用該紋理來渲染自定義片段着色器,並將其放入/解碼放入其中的自定義格式,則可以執行此操作。例如,從紋理採樣器中讀取的值可以採用任何您想要的格式。

float fR = texture2D(gsuTexture0, gsvTexCoord0).r; 
float fG = texture2D(gsuTexture0, gsvTexCoord0).g; 
float fB = texture2D(gsuTexture0, gsvTexCoord0).b; 
float fA = texture2D(gsuTexture0, gsvTexCoord0).a; 

float fDepth = fR; 
+0

他的問題是他的實現不支持'GL_OES_depth_texture'。但我認爲如果你修改這個答案來指出將深度值包裝到顏色緩衝區中,它可能會解決他的問題。不幸的是,它會增加額外的內存帶寬/存儲需求,OpenGL ES設備開始時很少使用,但它可能會有所斬獲。我本來會建議我自己,但增加的內存需求使我不這麼想。 –

+0

嗨安東,只是所以我明白你在提議什麼,你是說我把所有東西都渲染到一個顏色緩衝區,我只記錄深度值?有沒有一些技巧可以更有效地完成我缺少的任務?爲了達到這個效果,我可以將場景再次渲染到我的較低雷茲效果緩衝區,但是我想弄清楚如何用z緩衝來避免這種情況。謝謝! – ItsLikeYouKnowWhatever

+0

@ItsLikeYouKnowWhateverWhat:不,沒有訣竅可以有效地做到這一點,可悲的是。對於需要使用深度緩衝區的算法來說,這是一種徹底的黑客攻擊,就像沒有硬件/ API支持的紋理一樣。但是您不必單獨進行渲染,您可以爲着色器添加額外的MRT目標,將深度打包到顏色緩衝區中;這就是D3D9中深度紋理的實現方式。 –