LWJGL入门指南:第一行LWJGL代码,如何安装LWJGL或生成maven或gradle依赖

it2025-07-24  6

LWJGL系列文章

LWJGL入门指南:序章LWJGL入门指南:安装LWJGL或生成maven或gradle依赖与第一行LWJGL代码LWJGL入门指南:一个“超级”简单的3D射击游戏demo

前言

上一章大体了解了lwjgl的结构,lwjgl集成了多个底层图形库和系统api库,本身并不提供上层抽象,我们在使用的时候只需要选择自己需要使用的库,并按照对应库的api进行开发即可。

模块依赖

如何配置依赖,lwjgl提供了依赖项生成工具,方便选择所需的依赖库和版本等配置。 lwjgl提供的依赖及项目生成工具

https://www.lwjgl.org/customize

可以通过上面这个地址选择哪些依赖项并生成就可以下载依赖项配置,演示使用maven配置pom.xml,将pom.xml中的配置配置到自己的项目中即可。

通过配置项生成的pom.xml依赖项示例

<properties> <lwjgl.version>3.2.3</lwjgl.version> <joml.version>1.9.25</joml.version> <steamworks4j.version>1.8.0</steamworks4j.version> <steamworks4j-server.version>1.8.0</steamworks4j-server.version> </properties> <profiles> <profile> <id>lwjgl-natives-macos-amd64</id> <activation> <os> <family>mac</family> <arch>amd64</arch> </os> </activation> <properties> <lwjgl.natives>natives-macos</lwjgl.natives> </properties> <dependencies> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-vulkan</artifactId> <classifier>natives-macos</classifier> </dependency> </dependencies> </profile> <profile> <id>lwjgl-natives-windows-amd64</id> <activation> <os> <family>windows</family> <arch>amd64</arch> </os> </activation> <properties> <lwjgl.natives>natives-windows</lwjgl.natives> </properties> </profile> <profile> <id>lwjgl-natives-windows-x86</id> <activation> <os> <family>windows</family> <arch>x86</arch> </os> </activation> <properties> <lwjgl.natives>natives-windows-x86</lwjgl.natives> </properties> </profile> </profiles> <dependencyManagement> <dependencies> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-bom</artifactId> <version>${lwjgl.version}</version> <scope>import</scope> <type>pom</type> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-assimp</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-bgfx</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-cuda</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-egl</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-glfw</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-jawt</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-jemalloc</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-libdivide</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-llvm</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-lmdb</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-lz4</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-meow</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-nanovg</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-nfd</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-nuklear</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-odbc</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-openal</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opencl</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opengl</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opengles</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-openvr</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opus</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-ovr</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-par</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-remotery</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-rpmalloc</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-shaderc</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-sse</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-stb</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-tinyexr</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-tinyfd</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-tootle</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-vma</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-vulkan</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-xxhash</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-yoga</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-zstd</artifactId> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-assimp</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-bgfx</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-jemalloc</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-libdivide</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-llvm</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-lmdb</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-lz4</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-meow</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-nanovg</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-nfd</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-nuklear</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-openal</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opengl</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opengles</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-openvr</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-opus</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-ovr</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-par</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-remotery</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-rpmalloc</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-shaderc</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-sse</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-stb</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-tinyexr</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-tinyfd</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-tootle</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-vma</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-xxhash</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-yoga</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.lwjgl</groupId> <artifactId>lwjgl-zstd</artifactId> <classifier>${lwjgl.natives}</classifier> </dependency> <dependency> <groupId>org.joml</groupId> <artifactId>joml</artifactId> <version>${joml.version}</version> </dependency> <dependency> <groupId>com.code-disaster.steamworks4j</groupId> <artifactId>steamworks4j</artifactId> <version>${steamworks4j.version}</version> </dependency> <dependency> <groupId>com.code-disaster.steamworks4j</groupId> <artifactId>steamworks4j-server</artifactId> <version>${steamworks4j-server.version}</version> </dependency> </dependencies>

功能实现

简单使用opengl创建和渲染窗口使用glfw进行处理窗口事件监听

代码实现

官方demo

import org.lwjgl.*; import org.lwjgl.glfw.*; import org.lwjgl.opengl.*; import org.lwjgl.system.*; import java.nio.*; import static org.lwjgl.glfw.Callbacks.*; import static org.lwjgl.glfw.GLFW.*; import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.system.MemoryStack.*; import static org.lwjgl.system.MemoryUtil.*; public class HelloWorld { // The window handle private long window; public void run() { System.out.println("Hello LWJGL " + Version.getVersion() + "!"); init(); loop(); // Free the window callbacks and destroy the window glfwFreeCallbacks(window); glfwDestroyWindow(window); // Terminate GLFW and free the error callback glfwTerminate(); glfwSetErrorCallback(null).free(); } private void init() { // Setup an error callback. The default implementation // will print the error message in System.err. GLFWErrorCallback.createPrint(System.err).set(); // Initialize GLFW. Most GLFW functions will not work before doing this. if ( !glfwInit() ) throw new IllegalStateException("Unable to initialize GLFW"); // Configure GLFW glfwDefaultWindowHints(); // optional, the current window hints are already the default glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE); // the window will stay hidden after creation glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE); // the window will be resizable // Create the window window = glfwCreateWindow(300, 300, "Hello World!", NULL, NULL); if ( window == NULL ) throw new RuntimeException("Failed to create the GLFW window"); // Setup a key callback. It will be called every time a key is pressed, repeated or released. glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE ) glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop }); // Get the thread stack and push a new frame try ( MemoryStack stack = stackPush() ) { IntBuffer pWidth = stack.mallocInt(1); // int* IntBuffer pHeight = stack.mallocInt(1); // int* // Get the window size passed to glfwCreateWindow glfwGetWindowSize(window, pWidth, pHeight); // Get the resolution of the primary monitor GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); // Center the window glfwSetWindowPos( window, (vidmode.width() - pWidth.get(0)) / 2, (vidmode.height() - pHeight.get(0)) / 2 ); } // the stack frame is popped automatically // Make the OpenGL context current glfwMakeContextCurrent(window); // Enable v-sync glfwSwapInterval(1); // Make the window visible glfwShowWindow(window); } private void loop() { // This line is critical for LWJGL's interoperation with GLFW's // OpenGL context, or any context that is managed externally. // LWJGL detects the context that is current in the current thread, // creates the GLCapabilities instance and makes the OpenGL // bindings available for use. GL.createCapabilities(); // Set the clear color glClearColor(1.0f, 0.0f, 0.0f, 0.0f); // Run the rendering loop until the user has attempted to close // the window or has pressed the ESCAPE key. while ( !glfwWindowShouldClose(window) ) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer glfwSwapBuffers(window); // swap the color buffers // Poll for window events. The key callback above will only be // invoked during this call. glfwPollEvents(); } } public static void main(String[] args) { new HelloWorld().run(); } }

测试及运行

执行main方法即可看到效果

支持eguid原创文章,欢迎“关注、点赞、收藏”三连。

最新回复(0)