Java使用Maven工程操作OpenGL ES绘制三角形和圆形;绘制完成后操作键盘控制然图形移动

这篇具有很好参考价值的文章主要介绍了Java使用Maven工程操作OpenGL ES绘制三角形和圆形;绘制完成后操作键盘控制然图形移动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OpenGL ES 绘制三角形,操作键盘移动位置

PS:想快速看到效果的小伙伴,可以在引入依赖后,先跳到完整代码部分

第一步:依赖引入

	<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>

第二步:创建类,引入需要的包,设置全局参数

1.创建类
public class TriangleExample {
......
}
2. 包引入
import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.MemoryStack;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.*;

import java.nio.IntBuffer;
import java.util.Objects;
import java.util.Random;
3. 全局参数
    // 窗口句柄
    private long window;
    // x坐标
    private float triangleX = 0.0f;
    // y坐标
    private float triangleY = 0.0f;
    // 步长
    private final float triangleSpeed = 0.05f;

第三步:定义一个初始化方法 init()

1. GLFW 错误信息的回调函数

这样做,在发生 GLFW 错误时,错误信息将被打印到标准错误流(System.err)

	GLFWErrorCallback.createPrint(System.err).set();
2. 初始化 GLFW 库
	if (!glfwInit()) {
           throw new IllegalStateException("Unable to initialize GLFW");
 	}
3. 窗口设置
    //设置默认的窗口提示参数
    glfwDefaultWindowHints();
    //设置窗口不可见
    glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
    //设置窗口可调整大小
    glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
    //指定窗口宽度
    int width = 500;
    //指定窗口高度
    int height = 500;
    //创建一个指定大小和标题的窗口。
    window = glfwCreateWindow(width, height, "OpenGL Triangle Example", NULL, NULL);
    //如果创建失败,抛出一个运行时异常
    if (window == NULL) {
        throw new RuntimeException("Failed to create the GLFW window");
    }
4. 设置键盘回调函数
  • 参数说明:
    • window: 表示触发键盘事件的窗口句柄。它指定了事件发生的窗口。
    • key:表示被按下或释放的键的键码。每个按键都有一个对应的唯一键码,用于标识不同的按键。
    • scancode:表示键的扫描码。扫描码是键盘硬件生成的唯一标识符,它与特定的键码相对应。
    • action: 表示键盘事件的动作类型。它可以有以下几种取值
      • GLFW_PRESS:按下了键。
      • GLFW_RELEASE:释放了键。
      • GLFW_REPEAT:重复按下了键,通常在按键持续按下时触发。
    • mods: 表示与键盘事件同时按下的修饰键(如 Shift、Ctrl、Alt 等),它是一个位字段,通过对特定位进行设置来表示修饰键的状态。

我们这里监听上下左右键,aswd键和一个esc退出键

	glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> {
        if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
            glfwSetWindowShouldClose(window, true);
        }
        if (key == GLFW_KEY_LEFT || key == GLFW_KEY_A) {
            triangleX -= triangleSpeed;
        } else if (key == GLFW_KEY_RIGHT || key == GLFW_KEY_D) {
            triangleX += triangleSpeed;
        } else if (key == GLFW_KEY_UP || key == GLFW_KEY_W) {
            triangleY += triangleSpeed;
        } else if (key == GLFW_KEY_DOWN || key == GLFW_KEY_S) {
            triangleY -= triangleSpeed;
        }
    });
5. 创建一个内存栈,窗口定位
	try (MemoryStack stack = MemoryStack.stackPush()) {
        //使用内存栈分配两个整型缓冲区,用于存储窗口的宽度和高度
        IntBuffer pWidth = stack.mallocInt(1);
        IntBuffer pHeight = stack.mallocInt(1);
        //获取窗口的实际大小,并将宽度和高度存储到缓冲区中
        glfwGetWindowSize(window, pWidth, pHeight);
        //获取当前主显示器的视频模式
        GLFWVidMode vidMode = glfwGetVideoMode(glfwGetPrimaryMonitor());
        //将窗口定位到屏幕中心,根据窗口和屏幕尺寸计算得到位置。
        glfwSetWindowPos(window, (Objects.requireNonNull(vidMode).width() - pWidth.get(0)) / 2, (vidMode.height() - pHeight.get(0)) / 2);
    }
6. 将指定的窗口设置为当前上下文

在进行 OpenGL 渲染之前,需要将窗口的 OpenGL 上下文设置为当前上下文
以确保 OpenGL 命令在正确的上下文中执行。

	glfwMakeContextCurrent(window);
7. 设置垂直同步(Vertical Sync)的刷新率

垂直同步是一种同步机制,它将渲染的帧率与显示器的刷新率进行同步
以避免出现画面撕裂(Tearing)的现象。
通过设置刷新率为1,表示与显示器的刷新率保持同步
即每次渲染完一帧后等待显示器垂直同步信号再进行下一帧的渲染。

	glfwSwapInterval(1);
8. 显示指定的窗口

在创建窗口后,默认是不可见的,通过调用该函数可以将窗口显示出来

	glfwShowWindow(window);
9. init()代码
    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);
        int width = 500;
        int height = 500;
        window = glfwCreateWindow(width, height, "OpenGL Triangle Example", 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);
            }
            if (key == GLFW_KEY_LEFT || key == GLFW_KEY_A) {
                triangleX -= triangleSpeed;
            } else if (key == GLFW_KEY_RIGHT || key == GLFW_KEY_D) {
                triangleX += triangleSpeed;
            } else if (key == GLFW_KEY_UP || key == GLFW_KEY_W) {
                triangleY += triangleSpeed;
            } else if (key == GLFW_KEY_DOWN || key == GLFW_KEY_S) {
                triangleY -= triangleSpeed;
            }
        });
        try (MemoryStack stack = MemoryStack.stackPush()) {
            IntBuffer pWidth = stack.mallocInt(1);
            IntBuffer pHeight = stack.mallocInt(1);
            glfwGetWindowSize(window, pWidth, pHeight);
            GLFWVidMode vidMode = glfwGetVideoMode(glfwGetPrimaryMonitor());
            glfwSetWindowPos(window, (Objects.requireNonNull(vidMode).width() - pWidth.get(0)) / 2, (vidMode.height() - pHeight.get(0)) / 2);
        }
        glfwMakeContextCurrent(window);
        glfwSwapInterval(1);
        glfwShowWindow(window);
    }

第四步:定义主循环体loop()

1. 创建并激活 OpenGL 上下文的功能
	GL.createCapabilities();
2. 设置清空颜色缓冲区的颜色

该行代码将清空颜色设置为黑色

	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
3. 主循环

用于不断渲染场景,直到窗口被关闭

	while (!glfwWindowShouldClose(window)){
		......
	}

----------------------------------以下属于循环体中的内容----------------------------------

4. 清空颜色缓冲区和深度缓冲区

将之前设置的清空颜色应用到缓冲区,并清除之前渲染的内容

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
5. 设置坐标系的原点
	glLoadIdentity();
6. 根据给定的偏移量将当前矩阵进行移动

triangleX和triangleY是控制三角形位置的变量,通过平移变换可以改变三角形的位置

 	glTranslatef(triangleX, triangleY, 0.0f);
7. 创建三角形

这个步骤可以简单理解为:着色–>画画–>着色–>画画–>…

	// 定义一个三角形的顶点序列
	glBegin(GL_TRIANGLES);
	//设置当前绘制的图元的颜色为红色
	glColor3f(1.0f, 0.0f, 0.0f);
	//定义三角形的一个顶点坐标
	glVertex2f(-0.6f, -0.4f);
	//设置当前绘制的图元的颜色为绿色
	glColor3f(0.0f, 1.0f, 0.0f);
	//定义三角形的第二个顶点坐标
	glVertex2f(0.6f, -0.4f);
	//设置当前绘制的图元的颜色为蓝色
	glColor3f(0.0f, 0.0f, 1.0f);
	//定义三角形的第三个顶点坐标
	glVertex2f(0.0f, 0.6f);
	//结束定义图元的顶点序列
	glEnd();
8. 交换前后缓冲区的内容,用于显示渲染结果
	glfwSwapBuffers(window);
9. 处理窗口事件,使窗口保持响应状态

例如处理键盘输入、鼠标事件等

	glfwPollEvents();
10. loop()代码
    private void loop() {
        GL.createCapabilities();
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        while (!glfwWindowShouldClose(window)) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glLoadIdentity();
            glTranslatef(triangleX, triangleY, 0.0f);
            glBegin(GL_TRIANGLES);
            glColor3f(1.0f, 0.0f, 0.0f);
            glVertex2f(-0.6f, -0.4f);
            glColor3f(0.0f, 1.0f, 0.0f);
            glVertex2f(0.6f, -0.4f);
            glColor3f(0.0f, 0.0f, 1.0f);
            glVertex2f(0.0f, 0.6f);
            glEnd();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    }

第五步:定义执行方法run()

1. 执行init()loop()
	init();
	loop();
2. 销毁窗口,关闭程序

用于销毁指定的 GLFW 窗口。它接受一个窗口句柄作为参数,通过调用该函数,可以释放窗口所占用的资源并关闭窗口

	glfwDestroyWindow(window);

用于终止 GLFW 库。它用于释放 GLFW 所使用的资源,并进行清理操作。在你的程序即将退出时,调用glfwTerminate()是一个好的实践,以确保资源被正确释放。

	glfwTerminate();
4. run()代码
   public void run() {
		init();
		loop();
        glfwDestroyWindow(window);
        glfwTerminate();
    }

完整代码

import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;
import org.lwjgl.system.MemoryStack;
import static org.lwjgl.glfw.GLFW.*;
import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.system.MemoryUtil.*;

import java.nio.IntBuffer;
import java.util.Objects;
import java.util.Random;

public class TriangleExample {
    private long window;
    private float triangleX = 0.0f;
    private float triangleY = 0.0f;
    private final float triangleSpeed = 0.05f;

    public void run() {
        init();
        loop();
        glfwDestroyWindow(window);
        glfwTerminate();
    }

    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);
        int width = 500;
        int height = 500;
        window = glfwCreateWindow(width, height, "OpenGL Triangle Example", 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);
            }
            if (key == GLFW_KEY_LEFT || key == GLFW_KEY_A) {
                triangleX -= triangleSpeed;
            } else if (key == GLFW_KEY_RIGHT || key == GLFW_KEY_D) {
                triangleX += triangleSpeed;
            } else if (key == GLFW_KEY_UP || key == GLFW_KEY_W) {
                triangleY += triangleSpeed;
            } else if (key == GLFW_KEY_DOWN || key == GLFW_KEY_S) {
                triangleY -= triangleSpeed;
            }
        });
        try (MemoryStack stack = MemoryStack.stackPush()) {
            IntBuffer pWidth = stack.mallocInt(1);
            IntBuffer pHeight = stack.mallocInt(1);
            glfwGetWindowSize(window, pWidth, pHeight);
            GLFWVidMode vidMode = glfwGetVideoMode(glfwGetPrimaryMonitor());
            glfwSetWindowPos(window, (Objects.requireNonNull(vidMode).width() - pWidth.get(0)) / 2, (vidMode.height() - pHeight.get(0)) / 2);
        }
        glfwMakeContextCurrent(window);
        glfwSwapInterval(1);
        glfwShowWindow(window);
    }

    private void loop() {
        GL.createCapabilities();
        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        while (!glfwWindowShouldClose(window)) {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
            glLoadIdentity();
            glTranslatef(triangleX, triangleY, 0.0f);
            glBegin(GL_TRIANGLES);
            glColor3f(1.0f, 0.0f, 0.0f);
            glVertex2f(-0.6f, -0.4f);
            glColor3f(0.0f, 1.0f, 0.0f);
            glVertex2f(0.6f, -0.4f);
            glColor3f(0.0f, 0.0f, 1.0f);
            glVertex2f(0.0f, 0.6f);
            glEnd();
            glfwSwapBuffers(window);
            glfwPollEvents();
        }
    }
    
    public static void main(String[] args) {
        new TriangleExample().run();
    }
}

效果图
java opengl,OpenGL ES,Java,java,maven

画圆

	glBegin(GL_TRIANGLE_FAN);
	
	float centerX = 0.0f;    // 圆心的X坐标
	float centerY = 0.0f;    // 圆心的Y坐标
	float radius = 0.5f;     // 圆的半径
	int numSegments = 99;    // 圆的细分段数
	
	glColor3f(0.0f, 2.4f, 5.5f);
	// 添加圆心顶点0
	glVertex2f(centerX, centerY);
	
	Random random = new Random();
	// 添加圆上的顶点
	for (int i = 0; i <= numSegments; i++) {
	
	    float v = random.nextFloat();
	    float v1 = random.nextFloat();
	    float v2 = random.nextFloat();
	    glColor3f(v, v1, v2);
	
	    float angle = (float) (2.0 * Math.PI * i / numSegments);
	    float x = centerX + radius * (float) Math.cos(angle);
	    float y = centerY + radius * (float) Math.sin(angle);
	    glVertex2f(x, y);
	}

效果图
java opengl,OpenGL ES,Java,java,maven

记得把三角形的代码注释了,不然可能会出现下面的效果

java opengl,OpenGL ES,Java,java,maven文章来源地址https://www.toymoban.com/news/detail-719253.html

到了这里,关于Java使用Maven工程操作OpenGL ES绘制三角形和圆形;绘制完成后操作键盘控制然图形移动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenGL ES入门教程(二)之绘制一个平面桌子

    上一篇文章OpenGL ES入门教程(一)编写第一个OpenGL程序,我们创建了自己的第一个OpenGL程序,实现了绘制红色背景的Activity页面,算是OpenGL ES的hello world程序吧。本篇文章基于上一篇文章基础上讲解如何使用OpenGL绘制一张平面桌子,桌子由一个长方形构成,且长方形中间绘制一

    2024年01月17日
    浏览(24)
  • OpenGL ES 2.0 for Android教程(三):编译着色器并绘制到屏幕

    文章传送门 OpenGL ES 2.0 for Android教程(一) OpenGL ES 2.0 for Android教程(二) OpenGL ES 2.0 for Android教程(四) OpenGL ES 2.0 for Android教程(五) OpenGL ES 2.0 for Android教程(六) OpenGL ES 2.0 for Android教程(七) OpenGL ES 2.0 for Android教程(八) OpenGL ES 2.0 for Android教程(九) 本章将继续我

    2023年04月26日
    浏览(45)
  • Maven(四):Maven的使用——java工程与Web工程

    本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注博主!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远! 使用 mvn archetype:generate 命令生成 Web 工程时,需要使用一个专门的 archetype 。这个专门生成 Web 工程

    2023年04月19日
    浏览(33)
  • OpenGL实现第一个窗口-三角形

    1.简介 此代码是基于Qt+OpenGL实现的,但是大部分的代码是OpenGL,Qt封装了一些类,方便使用。 2.准备工作 QOpenGLWidget 提供了三个便捷的虚函数,可以重写,用来重写实现典型的OpenGL任务。 不需要GLFW。 paintGL:渲染OpenGL场景。widget需要更新时调用。 resizeGL:设置OpenGL视口、投影

    2024年02月08日
    浏览(34)
  • OpenGL入门教程之 三角形练习

     本文章被包含在OpenGL学习专栏中。  本练习基于OpenGL绘制三角形中绘制三角形的代码程序。  1.绘制两个彼此相连的三角形。  2.创建相同的两个三角形,对它们的数据使用不同的VAO和VBO。  3.创建两个着色器程序。使用两个着色器程序分别绘制出一个绿色三角形和黄色三

    2023年04月21日
    浏览(26)
  • 使用opengl绘制茶壶并实现鼠标拖动

    难点如下:         坐标轴绘制             选定一个原点,将坐标轴正方向和反方向的俩个点进行连线,代码及效果如上图所示(本次程序中由于渲染原因,坐标轴颜色统一为棕色)         如何实现鼠标响应         OPENGL中封存有对鼠标进行相应的函数,

    2024年01月17日
    浏览(29)
  • QtOpenGL--使用OpenGL绘制曲面图(四)

    1. Qt5中的OpenGL OpenGL是用于硬件加速和3D绘图最广泛使用的图形API接口,几乎所有的桌面平台系统和大多数移动和嵌入式平台都对它提供了支持,有自己对应的实现版本。Qt库就提供了一系列方便的C++类,来帮助用户将由OpenGL支持而绘制的图形集成到自己的应用程序中。 在Qt5

    2024年02月14日
    浏览(23)
  • Raspberry Pi(树莓派)基于Raspbian操作系统开发OpenGL ES应用

    笔者在树莓派上开发OpenGL ES之前,特地从网上做了些功课。当前,无论是Raspberry Pi 3还是Zero,倘若要开启博通的Video Core GPU硬件加速,那么只能使用官方提供的 Raspbian OS 系统,并且需要使用存放在 /opt/vc/ 下的私有库。因此,我们只能通过EGL结合树莓派特定的DispManX运行时环境

    2024年02月09日
    浏览(34)
  • 高效使用Java构建工具|Maven篇|云效工程师指北

    大家好,我是胡晓宇,目前在云效主要负责Flow流水线编排、任务调度与执行引擎相关的工作。 作为一个有多年Java开发测试工具链开发经验的CRUD专家,使用过所有主流的Java构建工具,对于如何高效使用Java构建工具沉淀了一套方法。众所周知,当前最主流的Java构建工具为Ma

    2024年02月03日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包