2014-03-26 85 views
1

我正在編寫一個程序來顯示500萬個使用OpenGL進行渲染的矩形。 它大約需要約。 3秒鐘在屏幕上顯示這些矩形。 但是,當我嘗試放大/縮小或平移屏幕時,也會出現同樣的情況。如何在不渲染整個屏幕的情況下放大/縮小到OpenGL屏幕

我想知道是否有辦法將所有內容保存到內存/緩衝區,因此屏幕不必一遍遍地重新繪製。

我也打開其他解決方案。

以下是我的重塑功能:

static void reshape_cb() { 
    glViewport(0, 0, (GLint) screen_width, (GLint) screen_height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluOrtho2D (0.0, DESIGN_SIZE, 0.0, DESIGN_SIZE); 

} 

回答

5

我寫一個程序來顯示5個百萬矩形,用OpenGL渲染。它大約需要約。 3秒鐘在屏幕上顯示這些矩形。

這聽起來像是您以非常低效的方式發送繪圖命令。現代GPU能夠每秒渲染數以億計的三角形。我的猜測是,你正在使用即時模式。

我想知道是否有辦法將所有內容保存到內存/緩衝區,因此屏幕不必一遍遍地重新繪製。

縮放通常意味着視角或渲染分辨率的變化,因此需要完全重繪。

我也打開其他解決方案。謝謝。

您應該優化您的繪圖代碼。關鍵字爲:

  • 頂點數組
  • 頂點緩衝對象
  • 大拉批次
+0

感謝您的快速回復。我實際上在閱讀這些座標。來自數據庫的每個矩形,並使用GL_LINE_LOOP進行繪製。你認爲這是問題嗎? – user3097451

+0

@ user3097451:你的意思是你在渲染時從數據庫中讀取它?那麼,是的,那肯定是問題所在。只有在幾何數據發生變化並且以Vertex Buffer Object的形式將其上傳到OpenGL服務器端(= GPU)內存中時才應該讀取幾何數據。 – datenwolf

0

我同意,繪製了這一幕不應該採取3秒。

但是,要回答這個問題:是的,您可以這樣做。

您將呈現給屏幕外幀緩衝區(FBO),您甚至可以在另一個線程上使用單獨的共享上下文執行此操作,以免它阻止GUI。然後,GUI將使用最近呈現的FBO進行繪製(您可以對這些FBO進行雙重緩衝,以便在您使用舊FBO進行顯示時可以繪製另一個FBO)。然後,您可以以完全交互式幀速率平移和縮放呈現的FBO。當然,你不能進一步向上/向下/向左/向右平移,如果你放大太多(超過1.5倍或2倍),事情會變得模糊。但這是可以完成的。另外,正如在另一個答案中指出的那樣,您的視點或幾何體或陰影不能改變,就像在一張固定的照片中移動一樣。