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 {
private long window
;
public void run() {
System
.out
.println("Hello LWJGL " + Version
.getVersion() + "!");
init();
loop();
glfwFreeCallbacks(window
);
glfwDestroyWindow(window
);
glfwTerminate();
glfwSetErrorCallback(null
).free();
}
private void init() {
GLFWErrorCallback
.createPrint(System
.err
).set();
if ( !glfwInit() )
throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE
, GLFW_FALSE
);
glfwWindowHint(GLFW_RESIZABLE
, GLFW_TRUE
);
window
= glfwCreateWindow(300, 300, "Hello World!", NULL
, NULL
);
if ( window
== NULL
)
throw new RuntimeException("Failed to create the GLFW window");
glfwSetKeyCallback(window
, (window
, key
, scancode
, action
, mods
) -> {
if ( key
== GLFW_KEY_ESCAPE
&& action
== GLFW_RELEASE
)
glfwSetWindowShouldClose(window
, true);
});
try ( MemoryStack stack
= stackPush() ) {
IntBuffer pWidth
= stack
.mallocInt(1);
IntBuffer pHeight
= stack
.mallocInt(1);
glfwGetWindowSize(window
, pWidth
, pHeight
);
GLFWVidMode vidmode
= glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(
window
,
(vidmode
.width() - pWidth
.get(0)) / 2,
(vidmode
.height() - pHeight
.get(0)) / 2
);
}
glfwMakeContextCurrent(window
);
glfwSwapInterval(1);
glfwShowWindow(window
);
}
private void loop() {
GL
.createCapabilities();
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
while ( !glfwWindowShouldClose(window
) ) {
glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
glfwSwapBuffers(window
);
glfwPollEvents();
}
}
public static void main(String
[] args
) {
new HelloWorld().run();
}
}
测试及运行
执行main方法即可看到效果
支持eguid原创文章,欢迎“关注、点赞、收藏”三连。