2010-09-29 261 views
3

我正在用Java編寫遊戲LJGWL(OpenGL)。我正在使用一個爲我處理大量混亂細節的庫,但需要找到更快的方法來完成此操作。OpenGL着色器?

基本上我想設置屏幕上的每個像素以儘可能快的速度說隨機顏色。 「隨機顏色」只是一個數組[] [],每2-3秒更新一次。我已經嘗試繪製正反面和使用圖像,兩者對於我想要做的都很慢。

我想我想學習如何編寫GPU着色器?這是做到這一點的最快方法? LJGWL將OpenGL API暴露給java。任何有關如何開始使用OpenGL着色器的基本教程?或者我應該動態創建某種紋理,然後拋出整個紋理,會更快嗎?

+2

每個像素都是一樣的隨機顏色,還是每個像素都有不同的隨機顏色? – Will 2010-09-29 20:13:52

回答

6

如果是,你是靜態顯示同一圖像,比使用一個紋理或顯示列表就足夠了的情況。但是,如果你想經常更新它,着色器確實是最好的選擇。 Shader代碼在GPU上執行並修改GRAM中的數據,因此您不需要從CPU轉移到GPU。接下來最好的事情可能是一個像素或幀緩衝區對象。緩衝區對象允許您通過DMA讀取/寫入GRAM(無需通過CPU),因此它們可以非常快速。

我還沒有寫任何着色器,所以我不能推薦任何好的資源。但是SongHo's OpenGL pages是瞭解緩衝區對象的好地方。 (他的例子都是用C++做的)雖然

2

紋理是在屏幕上繪製的東西,畫以最快的方式一個紋理映射四到畫面中,它應該是速度不夠快。當您需要重新上傳紋理數據時,請使用glTexSubimage2D對其進行更新。

不需要使用着色器。

+0

+1,另一個提示是使用PBO來存儲這些「隨機像素」數據 – erjot 2010-09-30 11:40:00

0

我還沒有做在OpenGL着色器的任何工作,但鑑於在多個場合相同的情況下,我與紋理我扔了在屏幕頂部處理它,它非常有效的工作。

0

我不知道你是如何繪製準確的像素,但是這個限制你打可能是因爲數據的傳輸你的金額(低效?)。每隔2-3秒更新一個充滿像素的屏幕應該不會太難。儘管着色器能讓你更好的顯卡,他們將永遠不會低效的方法快,所以......

爲什麼你的代碼這麼慢?

  1. 什麼碼?你試過什麼代碼?你使用什麼紋理,渲染到...?
  2. 速度慢嗎?有多慢?你期望它有多快?
  3. 在視頻RAM中,速度能達到1920x1080(?)像素的速度有多快?您的硬件,驅動程序和操作系統是什麼?

我想你需要編輯/轉貼,然後才能幫助你解決問題。僅僅因爲速度很慢,並不能保證所有的着色器甚至會更快地位於