在本教程中,我们了解了 LWJGL 以及如何使用它来绘制三角形。对于使用 Java 创建高性能、跨平台游戏和多媒体应用程序的开发人员来说,这是一个绝佳的选择。它可以访问 OpenGL、OpenAL 和 OpenCL 等低级 API,这使其在图形、音频和计算密集型应用程序中非常通用。
通过积极的支持和持续的更新,LWJGL 仍然是 Java 游戏开发生态系统中一个强大的工具。
url=https://feeds.feedblitz.com/~/t/0/0/baeldung/~https://www.lwjgl.org/]轻量级 Java 游戏库[/url是一个功能强大的开源库,允许 Java 开发人员与 3D 图形、声音和输入处理的本机 API 进行交互。人们通常使用它来创建游戏和渲染 3D 图形,但它也可以应用于其他多媒体应用程序。
在本教程中,我们将深入了解 LWJGL 是什么、如何设置它以及展示其基本功能。
什么是LWJGL?
LWJGL 是一个低级 API,使 Java 应用程序能够与OpenGL、OpenAL和OpenCL等本机库进行交互,从而允许访问高性能多媒体、计算和音频功能。
虽然 Java 通常在JVM的抽象内运行,但 LWJGL 通过提供直接访问系统级资源的绑定突破了该层,使其成为游戏开发和多媒体应用程序的理想选择。
使用LWJGL的优势
LWJGL 提供许多功能,使其成为游戏开发者的理想选择。让我们来看看该库的一些最重要的功能:
1. 跨平台支持
使用 LWJGL 的一个主要优势是它能够在多个平台上运行。它适用于 Windows、macOS 和 Linux,无需修改代码。它在这些平台上提供了一致的 API,允许开发人员编写一次代码并在任何地方运行。
2. OpenGL 对 2D 和 3D 图形的支持
市场上有来自不同制造商的各种 GPU,每种 GPU 都有自己的实现,因此很难在本地使用。OpenGL 通过指定 GPU 制造商在其驱动程序中包含的 API 来解决此问题。它充当市场上各种 GPU 的软件接口。
LWJGL 是一种低级 API,其作用类似于 OpenGL 的包装器。它提供对 OpenGL API 的直接访问,这意味着开发人员可以在基于 Java 的游戏中利用 OpenGL 的所有最新特性和功能。它还降低了不熟悉 API 细节的 Java 开发人员的复杂性。
3. 用于音频的 OpenAL
开发人员将 OpenAL 用作游戏和其他音频应用程序的跨平台 3D 音频 API。它提供了多种处理声音的功能,例如应用混响等环境效果以及管理 2D 和 3D 声音资产的播放。
LWJGL 充当桥梁,允许 Java 开发人员在应用程序中使用 OpenAL 实现高级 3D 音频功能。借助 LWJGL 的 OpenAL 绑定,游戏开发人员可以将复杂的音频系统集成到他们的游戏中。
4.活跃的社区
LWJGL 得到了积极的维护,并且拥有一个强大的开发者社区,他们为其发展做出贡献并通过论坛和在线资源提供支持。LWJGL 用户可以依靠强大的资源和支持网络来帮助他们开发和完善项目。
LWJGL 实际操作
在使用 LWJGL 之前,我们需要确保我们的机器上安装了 Java 开发工具包 (JDK) 8 或更高版本。我们可以直接从其官方网站下载最新的库版本,也可以使用 Maven 或 Gradle 构建工具将其集成到我们的项目中。
要使用 LWJGL,我们需要包含核心库依赖项和可选模块(如有必要)。接下来,我们将查看使用 LWJGL 创建三角形的示例,并检查使其工作所需的库。
安装依赖项
以下命令导入LWJGL的物料清单 (BOM) 。通过导入lwjgl-bom,我们确保所有 LWJGL 模块与定义的版本一致。
<dependencyManagement> |
现在,除了核心库之外,我们还将安装GLFW和OpenGL模块的依赖项:
<dependencies> |
在这里,我们已将核心 LWJGL 库、GLFW 和 OpenGL 模块添加到项目中。接下来的三个依赖项与前面的相同,但它们包含本机库的分类器(例如 macOS 上的.dylib文件)。
这些本机库是 LWJGL 与操作系统、硬件和图形驱动程序交互所必需的。在本例中,lwjgl.natives设置为natives-macos-arm64,这意味着 maven 将获取适用于 macOS ARM64 架构的正确本机库。
初始化 GLFW
OpenGL 提供了一个用于渲染图形的抽象层,但并未创建渲染发生的上下文窗口。它也不管理鼠标点击或键盘按下等外部输入。GLFW创建此窗口并处理输入,而 OpenGL 则专注于窗口内的渲染。
GLFW 是一个开源的跨平台库,它提供用于创建窗口、处理用户输入(例如键盘、鼠标和操纵杆事件)以及管理图形应用程序的 OpenGL 上下文的工具。
我们将使用以下代码初始化 GLFW 库:
private void initializeGLFW() { |
这里glfwInit() 初始化 GLFW 库。方法glfwDefaultWindowHints()负责将所有窗口重置为默认值。类似地,其他方法负责确保窗口最初是隐藏的,并且可由用户调整大小。
创建并居中窗口
让我们创建一个宽度和高度为 500 像素的窗口,标题为“LWJGL Triangle”:
private void createWindow() { |
设置并初始化 OpenGL 上下文
我们需要使用 LWJGL 的 OpenGL 绑定初始化 OpenGL 上下文,并将窗口的上下文设置为当前上下文:
private void setupAndInitializeOpenGLContext() { |
GlfwSwapInterval (1) 将帧速率与显示器的刷新率同步以避免屏幕撕裂。glfwShowWindow ()确保窗口准备就绪后可见。
渲染三角形
现在,我们将渲染用绿色填充的三角形。渲染完成后,我们将执行内存清理。
三角形的每个顶点都由 3D 空间中的三个浮点值表示,对于 2D 三角形,最后一个 z 坐标设置为0.0f。memAllocFloat ()分配所需大小的FloatBuffer来保存内存中的顶点。分配缓冲区后,vertexBuffer.put(vertices).flip()方法将顶点数组加载到缓冲区中:
private void renderTriangle() { |
现在,直到窗口打开,glfwPollEvents()处理键盘输入并更新窗口状态。glClear (GL_COLOR_BUFFER_BIT)用黑色背景色清除屏幕并为新的渲染做好准备。
一旦屏幕准备就绪,我们使用glColor3f()将三角形颜色设置为绿色。glVertexPointer ()通知 OpenGL 有关vertexBuffer的信息,glDrawArrays()告诉 OpenGL 将三个顶点绘制为三角形。
渲染三角形后,memFree()函数释放vertexBuffer使用的内存,而glfwDestroyWindow() 和 glfwTerminate()会销毁 GLFW 窗口并释放所有分配的资源。
运行程序
运行程序时我们需要传递以下 VM 参数:
-Djava.library.path=~/.m2/repository/org/lwjgl/lwjgl/3.3.4/macos/arm64/org/lwjgl/liblwjgl.dylib |
java.library.path用于设置liblwjgl.dylib库路径。第二个参数 – XstartOnFirstThread特定于 macOS,因为它有限制,即与 UI 框架交互的本机线程需要在主线程上启动。