为什么要了解openGL
我的世界Minecraft,使用的是的OpenGL图形库,也意味着你如果需要进行一些图形的操作就会需要用的OpenGL处理。
openGL简介
- OpenGL一般被认为什么,具有什么功能
- OpenGL真正是一个什么东西。
- OpenGL规范的作用是什么,真正由谁实现
- 规范在哪里可以找到。如何理解规范的作用。
核心模式和立即渲染模式
- 什么是立即渲染模式,为什么又立即渲染模式的情况下还需要核心模式
- 核心模式和立即渲染模式的比较区别,为什么学习和新模式
- 为什么不学习最新的版本
- 为什么游戏开发不使用最新的opengl规范版本
拓展
- 拓展是什么?
- 拓展能流行起来?
- 为什么拓展可以成为OpenGL的规范?
- 如何区分机器支持不支持拓展?
状态机
- OpenGL的设计思想?如何工作的?
- OpenGL的状态是指什么?
- 如何更改OpenGL的状态
- 怎么使用OpenGL渲染
- 我们的主要手段是什么
对象
- 为什么OpenGL需要做抽象
- 如何理解OpenGL中的对象
- OpenGL中的工作流
- OpenGL中对象思想,如何实现多对象的渲染
LWJGL简介
GLFW
其他的辅助阅读材料:LWJGL入门指南:序章(我的世界(Minecraft)java原版同款游戏库) - 知乎 (zhihu.com)
环境搭建
模块依赖
功能实现
- 简单使用opengl创建和渲染窗口
- 使用glfw进行处理窗口事件监听
代码实现
官方demo
执行main方法即可看到结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
| 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 Main {
private long window; public static void main(String[] args) { System.out.println("Hello LWJGL" + Version.getVersion() + "!"); new Main().run(); } public void run(){ 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(); } } }
|
参考文章
LWJGL入门指南:序章(我的世界(Minecraft)java原版同款游戏库) - 知乎 (zhihu.com)
LWJGL入门指南:第一行LWJGL代码,如何安装LWJGL或生成maven或gradle依赖 - 知乎 (zhihu.com)
[OpenGL - LearnOpenGL CN (learnopengl-cn.github.io)](https://learnopengl-cn.github.io/01 Getting started/01 OpenGL/)