OpenGL开发利用lwjgl类库绘制一个三角形

本文一共分为2部分
  1. 创建展示窗口。
  2. 在窗口上绘制三角形。

在绘制三角形之前,需要创建一个OpenGL上下文(Context)和一个用于显示的窗口。然而,这些操作在每个系统上都是不一样的,OpenGL将这部分抽离了出去。

GLFW

GLFW是一个专门针对OpenGL的C语言库,它提供了一些渲染物体所需的最低限度的接口。它允许用户创建OpenGL上下文,定义窗口参数以及处理用户输入。

一、只绘制渲染窗口的代码

public class Demo01_open_window {
   
   

    public static void main(String[] args){
   
   
    
        glfwInit();//初始化

        glfwWindowHint(GLFW_VISIBLE, GL_FALSE);//设置窗口的可见性为false
        glfwWindowHint(GLFW_RESIZABLE, GL_TRUE);//设置窗口是否可以重新调整大小

        glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);//OpenGL的主版本号
        glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);//OpenGL的副版本号


        int width = 500;//窗口宽度
        int height = 300;//窗口高度

        long window = glfwCreateWindow(width, height, "Hello World!", NULL, NULL);//创建一个窗口,返回值是个long值。

        glfwMakeContextCurrent(window);//通知GLFW将window的上下文设置为当前线程的主上下文

        glfwShowWindow(window);//展示当前的窗口

        GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());//获取当前设备的一些属性

        glfwSetWindowPos(window, (vidmode.width() - width) / 2, (vidmode.height() - height) / 2);//设置窗口的位置在最中间

        GL.createCapabilities();//创建opengl上下文
		//不间断的一直渲染窗口,如果没有这步循环,窗口会一闪而过。
        while (!glfwWindowShouldClose(window)) {
   
   
        // 清除之前渲染的缓存
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 				
            glfwSwapBuffers(window); // 交换前后缓冲区
            glfwPollEvents();//检查是否有键盘或是鼠标事件
        }

        glfwTerminate();//释放之前分配的所有资源。
    }

}

运行结果:
在这里插入图片描述

上面代码中的相关说明
  • 如果不在一开始就调用glfwInit();函数,则后面的函数将都会失效。
  • OpenGL的主版本号在绘制图形时,一定要设置。
  • 双缓冲(Double Buffer):应用程序使用单缓冲绘图时可能会存在图像闪烁的问题。 这是因为生成的图像不是一下子被绘制出来的,而是按照从左到右,由上而下逐像素地绘制而成的。最终图像不是在瞬间显示给用户,而是通过一步一步生成的,这会导致渲染的结果很不真实。为了规避这些问题,我们应用双缓冲渲染窗口应用程序。前缓冲保存着最终输出的图像,它会在屏幕上显示;而所有的的渲染指令都会在后缓冲上绘制。当所有的渲染指令执行完毕后,我们glfwSwapBuffers()函数就是用来交换(Swap)前缓冲和后缓冲的,这样图像就立即呈显出来,之前提到的不真实感就消除了。

二、绘制三角形的代码

将展示窗口进行封装整理,分别封装成以下几个类:

  • DrawTriangleMain:主函数入口。
  • Window:展示窗口。
  • ShaderProgram:着色器处理类。
  • Model:三角形顶点相关。
  • Renderer:负责渲染,即循环绘制图像。
DrawTriangleMain类

public class DrawTriangleMain {
   
   

    public static void main(String[] args) throws Exception {
   <
在Java中使用LWJGL(Lightweight Java Game Library)库操作OpenGL进行三角形平移,首先你需要设置好OpenGL环境并加载必要的库。以下是一个基本步骤: 1. **初始化GL**: ```java import org.lwjgl.opengl.GL11; // ... public static void initGL() { GL11.glEnable(GL11.GL_DEPTH_TEST); GL11.glClearColor(0f, 0f, 0f, 1f); // 设置背景颜色 } ``` 2. **创建顶点数组对象(VAO)**: ```java VAO vao = glGenVertexArrays(); glBindVertexArray(vao); ``` 3. **准备顶点数据**: 通常会有一个包含顶点坐标、颜色和纹理坐标的`glm::vec3`数组。这里假设你已经有了一个`float[] vertices`。 4. **创建缓冲区对象(Buffer Object, BO)**: ```java int vertexBuffer = glGenBuffers(); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); ByteBuffer bb = BufferUtils.createByteBuffer(vertices.length * 3 * Float.BYTES); bb.put(vertices); bb.flip(); // 数据从内存翻转到缓冲区 glBufferData(GL_ARRAY_BUFFER, bb, GL_STATIC_DRAW); ``` 5. **设置顶点属性**: ```java int vertexLocation = glGetAttribLocation(glProgram, "position"); glVertexAttribPointer(vertexLocation, 3, GL_FLOAT, false, 0, 0); glEnableVertexAttribArray(vertexLocation); // 对于其他需要的属性如颜色、纹理坐标,重复以上过程 ``` 6. **平移变换**: 在绘制前,可以使用`glTranslatef(x, y, z)`函数进行模型空间平移,例如: ```java float translationX = 1.0f; // 要平移的距离 float translationY = 0.0f; float translationZ = 0.0f; GL11.glTranslatef(translationX, translationY, translationZ); ``` 7. **绘制三角形**: ```java glDrawArrays(GL_TRIANGLES, 0, vertices.length / 3); // 根据实际顶点数绘制 ``` 8. **清理**: ```java glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); ``` 记得最后别忘了关闭资源: ```java GL11.glDeleteVertexArrays(vao); GL11.glDeleteBuffers(vertexBuffer); ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值