2013-10-10 82 views
-2

注意:在我的OpenGL項目中,我啓用了SDL_GL_SwapBuffers,就像SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1)一樣。保留並組合渲染的像素

我如何留住像素調用SDL_GL_SwapBuffers()後,所以重用渲染的像素,而無需再次渲染它們,而且比我如何結合保留像素爲背景層,清除緩衝區glClear()和渲染多邊形背景圖層的頂部?

提供註釋示例代碼。

+2

'提供註釋示例代碼.' SO不以這種方式操作。 – this

回答

1

從技術上講,您可能能夠獲取backbuffer的舊內容,具體取決於您選擇的交換方法。這是一個徹頭徹尾的黑客,但它可以工作。如果是交換,如果在不清除顏色緩衝區的情況下再次交換緩衝區,則可能會在前臺緩衝區中放置前置緩衝區的舊副本。如果你的交換方法是複製,那麼你的後備緩存不應該被清除,除非你自己發出glClear (...)。要小心,因爲有第三個通用交換選項,如果您在交換後嘗試讀取它們,則會使緩衝區的內容不確定。

我提到的最後一個交換行爲在嵌入式圖形設備上很常見,例如PowerVR(iOS)。與臺式機不太一樣。這一切都假定OpenGL的窗口系統實現使用1個前緩衝區和1個後緩衝區,這使我回到這是一個完全破解的聲明。幕後實現可以實現三重緩衝,並且大多數窗口系統API甚至不提供請求後臺緩衝區數量的方法,更不用說查詢它了。交換鏈是在GL世界討厭的東西: - \

總之,框架攤銷渲染(使用前幀中計算完成的算法值)可以在OpenGL來完成,但你只會讓生活更如果嘗試使用窗口系統(例如WGL,glX,CGL,EGL)使用的實際前/後緩衝區,則很困難。你需要做的事很簡單,就是吸引一個FBO並且自己管理一個FBO的交換鏈。這不幸的是會增加內存需求,但這是大多數現代圖形引擎的攤銷方法。

你需要自己查找這個FBO,我解釋了這個理論,這是你所期望的(爲了將來的參考),因爲這個問題沒有包含任何代碼。

+0

感謝您的信息。我希望那裏有我不知道考慮的簡單解決方案。我會嘗試你的建議... –

+0

@ 8-bitButterfly:我重新讀你的問題,我認爲你的問題可能比標題和一些細節讓人更容易。如果您真正想要做的是分層渲染,則可以考慮清除**圖層之間的深度緩衝區(** NOT **顏色緩衝區),並在完成繪製所有圖層時僅交換緩衝區。 –