LWJGL簡介
1. 概述
**輕量級 Java 遊戲庫(LWJGL)**是一個功能強大的開源程式庫,可讓 Java 開發人員與本機 API 進行互動以進行 3D 圖形、聲音和輸入處理。人們通常使用它來創建遊戲和渲染 3D 圖形,但它也可以應用於其他多媒體應用程式。
在本教程中,我們將深入了解 LWJGL 是什麼、如何設定它並展示其基本功能。
2.什麼是LWJGL?
LWJGL 是一種低階 API,使 Java 應用程式能夠與本機程式庫(例如OpenGL 、 OpenAL和OpenCL )進行交互,從而允許存取高效能多媒體、運算和音訊功能。
雖然 Java 通常在 JVM 的抽像中運行,但 LWJGL 透過提供直接存取系統級資源的綁定突破了該層,使其成為遊戲開發和多媒體應用程式的理想選擇。
3. 使用LWJGL的優點
LWJGL 提供的許多功能使其成為遊戲開發商的有吸引力的選擇。讓我們來看看該庫的一些最重要的功能:
3.1.跨平台支援
使用 LWJGL 的一個主要優點是它能夠在多個平台上運作。它可以在 Windows、macOS 和 Linux 上運行,無需修改您的程式碼。它在這些平台上提供一致的 API,允許開發人員編寫一次程式碼並在任何地方運行。
3.2.對 2D 和 3D 圖形的 OpenGL 支持
市場上提供了來自不同製造商的各種 GPU,每個 GPU 都有自己的實現,因此很難在本地使用。 OpenGL 透過指定 GPU 製造商在其驅動程式中包含的 API 來解決這個問題。它充當市場上各種 GPU 的軟體介面。
LWJGL 是一個低階 API,其作用類似於 OpenGL 的包裝器。它提供對 OpenGL API 的直接訪問,這意味著開發人員可以在基於 Java 的遊戲中使用 OpenGL 的所有最新特性和功能。它還降低了不熟悉 API 細節的 Java 開發人員的複雜性。
3.3. OpenAL 音訊
開發人員使用 OpenAL 作為遊戲和其他音訊應用程式的跨平台 3D 音訊 API。它提供了各種用於處理聲音的功能,例如應用混響等環境效果以及管理 2D 和 3D 聲音資產的播放。
LWJGL 充當橋樑,允許 Java 開發人員在應用程式中使用 OpenAL 實現高級 3D 音訊功能。借助 LWJGL 的 OpenAL 綁定,遊戲開發人員可以將複雜的音訊系統整合到他們的遊戲中。
3.4.活躍的社區
LWJGL 得到積極維護,有一個強大的開發者社區,他們為其發展做出貢獻,並透過論壇和線上資源提供支援。 LWJGL 使用者可以依靠強大的資源和支援網絡來幫助他們開發和完善專案。
4. LWJGL在行動
在使用LWJGL之前,我們需要確保我們的機器上安裝了Java開發工具包(JDK)版本8或更高版本。我們可以直接從其官方網站下載最新的庫版本,也可以使用 Maven 或 Gradle 建置工具將其整合到我們的專案中。
要使用 LWJGL,我們需要包含核心庫相依性和選用模組(如有必要)。接下來,我們將看一下使用 LWJGL 建立三角形的範例,並檢查使其工作所需的庫。
4.1.安裝依賴項
以下指令匯入LWJGL的物料清單 (BOM)。透過導入[lwjgl-bom](https://mvnrepository.com/artifact/org.lwjgl/lwjgl-bom) ,
我們確保所有 LWJGL 模組與定義的版本一致。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-bom</artifactId>
<version>${lwjgl.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
現在,除了核心庫之外,我們還將安裝GLFW和OpenGL模組的依賴項:
<dependencies>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-glfw</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-opengl</artifactId>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-glfw</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
<dependency>
<groupId>org.lwjgl</groupId>
<artifactId>lwjgl-opengl</artifactId>
<classifier>${lwjgl.natives}</classifier>
</dependency>
</dependencies>
在這裡,我們已將核心 LWJGL 庫、GLFW 和 OpenGL 模組新增到專案中。接下來的三個依賴項與前面的相同,但它們包含本機庫的classifier
(例如 macOS 上的.dylib
檔案)。
LWJGL 需要這些本機程式庫才能與作業系統、硬體和圖形驅動程式互動。在本例中, lwjgl.natives
設定為natives-macos-arm64,
這表示 maven 將為 macOS ARM64 架構取得正確的本機程式庫。
4.2.初始化 GLFW
OpenGL 提供了用於渲染圖形的抽象層,但不會建立渲染發生的上下文視窗。它也不管理外部輸入,例如滑鼠點擊或鍵盤按下。 GLFW 建立此視窗並處理輸入處理,而 OpenGL 則專注於視窗內的渲染。
GLFW 是一個開源、跨平台庫,提供用於建立視窗、處理使用者輸入(例如鍵盤、滑鼠和操縱桿事件)以及管理圖形應用程式的 OpenGL 上下文的工具。
我們將使用以下程式碼初始化 GLFW 庫:
private void initializeGLFW() {
if (!glfwInit()) {
throw new IllegalStateException("Unable to initialize GLFW");
}
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
}
這裡glfwInit()
初始化 GLFW 函式庫。 glfwDefaultWindowHints()
方法負責將所有視窗重設為其預設值。類似地,其他方法負責確保視窗最初是隱藏的並且可由使用者調整大小。
4.3.建立視窗並使其居中
讓我們建立一個寬度和高度均為 500 像素的窗口,標題為「LWJGL Triangle」:
private void createWindow() {
window = glfwCreateWindow(500, 500, "LWJGL Triangle", 0, 0);
if (window == 0) {
throw new RuntimeException("Failed to create the GLFW window");
}
}
4.4.設定和初始化 OpenGL 上下文
我們需要使用 LWJGL 的 OpenGL 綁定來初始化 OpenGL 上下文,並將視窗的上下文設為目前上下文:
private void setupAndInitializeOpenGLContext() {
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwShowWindow(window);
GL.createCapabilities();
}
GlfwSwapInterval (1) 將幀速率與顯示器的更新率同步,以避免螢幕撕裂。 glfwShowWindow()
確保視窗在準備好後可見。
4.5.渲染三角形
現在,我們將渲染三角形並填充綠色。一旦渲染完成,我們將執行記憶體清理。
三角形的每個頂點由 3D 空間中的三個浮點值表示,對於 2D 三角形,最後一個 z 座標設定為0.0f
。 memAllocFloat()
分配所需大小的FloatBuffer
以在記憶體中保存vertices
。分配緩衝區後, vertexBuffer.put(vertices).flip()
方法將vertices
陣列載入到緩衝區中:
private void renderTriangle() {
float[] vertices = {
0.0f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f
};
FloatBuffer vertexBuffer = memAllocFloat(vertices.length);
vertexBuffer.put(vertices).flip();
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f, 1.0f, 0.0f);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertexBuffer);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_VERTEX_ARRAY);
glfwSwapBuffers(window);
}
memFree(vertexBuffer);
glfwDestroyWindow(window);
glfwTerminate();
}
現在,直到視窗開啟為止, glfwPollEvents()
都會處理鍵盤輸入並更新視窗狀態。 glClear(GL_COLOR_BUFFER_BIT)
用黑色背景清除螢幕,並為新的渲染做好準備。
螢幕準備好後,我們使用glColor3f()
將三角形顏色設為綠色。 glVertexPointer()
通知 OpenGL 有關vertexBuffer
的信息, glDrawArrays()
告訴 OpenGL 將三個頂點繪製為三角形。
渲染三角形後, memFree()
函數釋放vertexBuffer
所使用的內存,而glfwDestroyWindow() and glfwTerminate()
銷毀 GLFW 視窗並釋放任何已指派的資源。
4.6.運行程式
執行程式時我們需要傳遞以下 VM 參數:
-Djava.library.path=~/.m2/repository/org/lwjgl/lwjgl/3.3.4/macos/arm64/org/lwjgl/liblwjgl.dylib
-XstartOnFirstThread
java.library.path
用於設定liblwjgl.dylib
庫路徑。第二個參數 – XstartOnFirstThread
特定於 macOS,因為它有一些限制,即與 UI 框架互動的本機執行緒需要在主執行緒上啟動。
輸出如下圖所示:
5. 結論
在本教程中,我們學習了 LWJGL 以及如何使用它來繪製三角形。對於使用 Java 創建高效能、跨平台遊戲和多媒體應用程式的開發人員來說,這是一個絕佳的選擇。它對 OpenGL、OpenAL 和 OpenCL 等低階 API 的存取使其非常適合圖形、音訊和運算密集型應用程式。
憑藉積極的支援和持續的更新,LWJGL 仍然是 Java 遊戲開發生態系統中的強大工具。
與往常一樣,所有原始程式碼都可以在 GitHub 上取得。