2012-06-23 121 views
0

我一直在使用java常規圖形設備,awt和swing東西,Graphics和Graphics2D等等,然後開始觀看關於LWJGL的一系列教程。我非常喜歡並決定在該系統中重做我的一款遊戲。我想,因爲我已經有了邏輯,這很容易。我遇到了一個概念問題。如何使用LWJGL將圖像保存在內存中?

在這個特定的情況下,我有一個類框代表一個盒子,但我用圖像繪製它,從而製作邊框。我有9個圖像,一個用於中心(這只是一個普通的彩色1像素寬度的圖像),4個用於側邊,4個用於角落。我將所有這些圖像放在一個BufferedImage數組中,這是靜態的,因爲它對所有盒子都是一樣的。然後,每個盒子都有一個全局的BufferedImage,我在其中畫出了盒子,這個過程非常緩慢,因爲我必須在盒子的每個部分繪製圖像。然後,在真正的繪製方法(即接收圖形g)中,我只是將BufferedImage繪製在正確的位置。由於框的大小一旦創建就不會改變,我只需在構造函數中「創建」一次框圖。

我無法確定如何使用LWJGL做到這一點,因爲gl_方法(glBegin(),glVertex2i())將始終在屏幕上繪製,即使我從未指定過。那麼我如何繪製圖像,如何將其存儲在內存中(也可以使用BufferedImage),以及當我需要時如何在屏幕上繪製它?我發現LWJGL使用紋理,並且我使BufferedImage的第一個靜態數組成爲Texture的一個靜態數組,然後將9個紋理中的每一個正確保存在其中。這是正確的方式嗎?全球的BufferedImage怎麼樣,它應該是一個全球性的紋理?在那種情況下,如何在紋理上「繪製」?

回答

1

您正在尋找的技術通常稱爲「渲染到紋理」(RTT)。你創建一個opengl framebuffer,附加一個紋理,綁定你的framebuffer,然後發出正常的繪製調用。隨着幀緩衝區的限制,繪製調用將直接繪製到您的紋理中。然後解除綁定幀緩衝區並將紋理用作普通紋理。

有了這些搜索條件,我相信你可以在網上找到關於如何做到這一點的教程。

雖然我只是好奇,你的盒子是什麼樣子,它不能用正常的紋理繪製?也許有一個更簡單的方法去做。

+0

非常感謝,我現在正在尋找它,我相信它會非常有用。關於這個盒子,也許我只是不知道紋理是如何工作的,但它是這樣的:你創建的每個盒子都有不同的尺寸,並且它們都具有相同的固定尺寸邊界。所以我猜想更好的辦法是創建9個圖像,就像我說的。我不知道是否有更好的方法 - 我想象一下,靜態紋理的邊框會與盒子成比例地增長,我不想那樣。 –

1

看看這個LWJGL texture tutorial,從他們的wiki。 在這個例子中,他們使用Slick-Util Library,這使得從圖像創建紋理變得更容易。


或者你可以自己生成紋理:

BufferedImage bufferedImage = ...; 
ByteBuffer textureBuffer = convertImageData(bufferedImage); 

int texture = glGenTextures(); 
glBindTexture(GL_TEXTURE_2D, texture); 

int pixelFormat; 
if (bufferedImage.getColorModel().hasAlpha()) { 
    pixelFormat = GL_RGBA; 
} else { 
    pixelFormat = GL_RGB; 
} 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
     bufferedImage.getWidth(), bufferedImage.getHeight(), 0, 
     pixelFormat, GL_UNSIGNED_BYTE, textureBuffer); 

Aaaaaand看到this answer爲convertImageData()我以前也寫過。 (在他的代碼中可以刪除幾行)

要繪製紋理:請參見LWJGL Space Invaders的第97行。

+0

看到我編輯的答案,它*應*工作。 :) – 2012-06-24 23:33:37

+0

我試過了,並沒有給出任何錯誤,但它仍然不起作用。它會生成BufferedImage OK(我將它保存在一個文件中以供查看),但正方形出現時紋理混亂。我試圖找到這個錯誤,這肯定是我在代碼的其他部分犯的錯誤。感謝您的回答! –

1

在OpenGL中,縮放比較便宜。你不需要預先生成任何東西。您可以將所有圖像放入同一個紋理中,並在繪製到屏幕時使用紋理貼圖進行正確放置和縮放。

如果您已經有使用BufferedImage的解決方案,請保持這種方式。在GPU上生成此圖像不會節省您太多時間。使用awt生成圖像,創建紋理並使用LWJGL將其繪製到屏幕上。

如果你真的想要這樣做,你可以使用glCopyPixels從屏幕保存東西到紋理。但我不會從那開始學習OpenGL。避免將圖像傳輸到主內存(將其保存在不是BufferedImage的紋理中),在CPU和GPU之間發送數據可能非常緩慢。

+0

我尋找紋理映射,我找不到任何方法來做我想做的(但沒有找到任何偉大的教程,只是一些特定的點)。我試圖從BufferedImage生成紋理,但它不起作用;我確信商業智能創建正確,我用從互聯網複製的方法,但它顯示一個白色框。我試圖使用紋理映射,我收到了另一個消解,但是也沒有用它做任何事情。 –

相關問題