【JAVA】使用OPENGL

从这个网址下载对应的库:

LWJGL - Lightweight Java Game Libraryicon-default.png?t=N7T8https://www.lwjgl.org/browse/release/3.3.3下载这个压缩包(实际上有很多版本3.3.3是比较新的版本:LWJGL - Lightweight Java Game Library):

https://build.lwjgl.org/release/3.3.3/lwjgl-3.3.3.zip

注意,下载的这个压缩包解压后,解压后,里边的jar包会比较多,使用IDE(我使用的IDEA)创建工程后,要把这些LWJGL的库添加到工程:

这里是需要把整个解压目录里边所有Jar包添加进来,IDEA建立索引要花点时间,注意是子目录和子目录的Jar包:

如果上边这步没有问题,那么可以新建一个HelloWorld.java了,这里网站:

LWJGL - Lightweight Java Game Libraryicon-default.png?t=N7T8https://www.lwjgl.org/guide给了一个示例程序:

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();
	}

}

如果没有问题,运行的结果会是这样的:

下边这个代码是画一条直线:

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.GL32.*;
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(600, 600, "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() {
        GL.createCapabilities();

        glClearColor(1.0f, 1.0f, 0.0f, 0.0f);

        glClear(GL_COLOR_BUFFER_BIT);

        glLineWidth(5);
        glColor3f(1f, 0f, 0f);

        glBegin(GL_LINES);
        glVertex2i(0, 0);
        glVertex2i(0, 2);
        glEnd();
        glfwSwapBuffers(window);
        while (true)
        {
            glfwPollEvents();
        }
    }

    public static void main(String[] args) {
        new HelloWorld().run();
    }

}

显示效果如下: 

其实最终不是想画直线,目标是画3D图形,带放大,旋转,平移等等功能的。。。 

这部分代码很多不生效的,测试旋转、平移,是可以的:

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.GL32.*;
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(600, 600, "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() {
        GL.createCapabilities();

        float rTri = 0.5f;
        float rQuad = 1f;

        glClearColor(1.0f, 1.0f, 0.0f, 0.0f);

        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存



        //-----------------------------------------
        glLoadIdentity();   //重置当前的模型观察矩阵
        glTranslatef(0.1f, -0.2f, -0.20f); //平移矩阵
        glRotatef(30, 0.0f, 0.0f, 1.0f); //绕Z轴旋转30度
        glLineWidth(1);
        glColor3f(1f, 0f, 0f);

        glBegin(GL_LINES);
        glVertex2i(0, 0);
        glVertex2i(0, 1);
        glEnd();

        //-----------------------------------------
        glLoadIdentity();   //重置当前的模型观察矩阵
        glTranslatef(-1.5f, 0.0f, -116.0f);

        glRotatef(rTri, 0.0f, 1.0f, 0.0f); //绕Y轴旋转rTri度

        //开始绘制三角形
        glBegin(GL_TRIANGLES);

        //前侧面
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);      //上顶点
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);    //左下顶点
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);     //右下顶点

        //右侧面
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);      //上顶点
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);     //左下顶点
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);    //右下顶点

        //后侧面
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);      //上顶点
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);    //左下顶点
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);   //右下顶点

        //左侧面
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(0.0f, 1.0f, 0.0f);      //上顶点
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左下顶点
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(-1.0f, -1.0f, 1.0f);    //右下顶点

        glEnd();
        //绘制三角形结束

        //-----------------------------------------
        glLoadIdentity();   //重置当前的模型观察矩阵

        glTranslatef(-1.5f, 0.0f, -117.0f);	//越远的对象看起来越小

        glRotatef(30, 1.0f, 1.0f, 0.0f);    //绕X轴旋转rQuad度

        //开始绘制正方形
        glTranslatef(3.0f, 0.0f, 0.0f);

        glBegin(GL_QUADS);

        //顶面
        glColor3f(0.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, 1.0f, -1.0f);     //右上顶点
        glVertex3f(-1.0f, 1.0f, -1.0f);    //左上顶点
        glVertex3f(-1.0f, 1.0f, 1.0f);     //左下顶点
        glVertex3f(1.0f, 1.0f, 1.0f);      //右下顶点

        //底面
        glColor3f(1.0f, 0.5f, 0.0f);
        glVertex3f(1.0f, -1.0f, 1.0f);     //右上顶点
        glVertex3f(-1.0f, -1.0f, 1.0f);    //左上顶点
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左下顶点
        glVertex3f(1.0f, -1.0f, -1.0f);    //右下顶点

        //前面
        glColor3f(1.0f, 0.0f, 0.0f);
        glVertex3f(1.0f, 1.0f, 1.0f);      //右上顶点
        glVertex3f(-1.0f, 1.0f, 1.0f);     //左上顶点
        glVertex3f(-1.0f, -1.0f, 1.0f);    //左下顶点
        glVertex3f(1.0f, -1.0f, 1.0f);     //右下顶点

        //后面
        glColor3f(1.0f, 1.0f, 0.0f);
        glVertex3f(1.0f, -1.0f, -1.0f);    //右上顶点
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左上顶点
        glVertex3f(-1.0f, 1.0f, -1.0f);    //左下顶点
        glVertex3f(1.0f, 1.0f, -1.0f);     //右下顶点

        //左侧面
        glColor3f(0.0f, 0.0f, 1.0f);
        glVertex3f(-1.0f, 1.0f, 1.0f);     //右上顶点
        glVertex3f(-1.0f, 1.0f, -1.0f);    //左上顶点
        glVertex3f(-1.0f, -1.0f, -1.0f);   //左下顶点
        glVertex3f(-1.0f, -1.0f, 1.0f);     //右下顶点

        //右侧面
        glColor3f(1.0f, 0.0f, 1.0f);
        glVertex3f(1.0f, 1.0f, -1.0f);     //右上顶点
        glVertex3f(1.0f, 1.0f, 1.0f);      //左上顶点
        glVertex3f(1.0f, -1.0f, 1.0f);     //左下顶点
        glVertex3f(1.0f, -1.0f, -1.0f);    //右下顶点

        glEnd();
        //绘制正方形结束

        //-----------------------------------------
        rTri += 5;
        rQuad += 5;
        //————————————————
        //版权声明:本文为CSDN博主「贝勒里恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
        //原文链接:https://blog.csdn.net/Mr_robot_strange/article/details/123682686
        glfwSwapBuffers(window);
        while (true)
        {
            glfwPollEvents();
        }

    }

    public static void main(String[] args) {
        new HelloWorld().run();
    }

}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Swing 是一个基于 Java 的图形用户界面(GUI)工具包,主要用于开发桌面应用程序。而 OpenGL 是一个跨平台的 3D 图形库,通常用于游戏开发和科学可视化等领域。 虽然 Java Swing 自带一些绘图功能,但是如果需要实现复杂的 3D 图形渲染效果,还是需要使用 OpenGL 这样的专业图形库。在 Java Swing 中使用 OpenGL 可以通过 JOGL(Java OpenGL)库来实现。 以下是使用 JOGL 实现在 Java Swing 中使用 OpenGL 渲染的基本步骤: 1. 引入 JOGL 库:在项目中引入 JOGL 库,可以通过 Maven 或手动下载并添加到项目中来。 2. 创建 OpenGL 帧缓冲区:在 Java Swing 中创建一个 JPanel,用于在其中显示 OpenGL 渲染的图像。在 JPanel 中创建一个 GLJPanel,作为 OpenGL 帧缓冲区。 3. 实现 OpenGL 渲染器:创建一个实现 GLEventListener 接口的类,用于实现 OpenGL 渲染器。在其中实现 OpenGL 渲染所需的初始化、绘制等方法。 4. 在 JPanel 中添加 GLJPanel:将 GLJPanel 添加到 JPanel 中,以便在其中进行 OpenGL 渲染。 下面是一个简单的示例代码,演示如何在 Java Swing 中使用 JOGL 库实现 OpenGL 渲染: ```java import javax.swing.JFrame; import javax.swing.JPanel; import com.jogamp.opengl.GL; import com.jogamp.opengl.GLAutoDrawable; import com.jogamp.opengl.GLCapabilities; import com.jogamp.opengl.GLEventListener; import com.jogamp.opengl.awt.GLJPanel; public class OpenGLDemo extends JPanel implements GLEventListener { private static final long serialVersionUID = 1L; private GLJPanel panel; public OpenGLDemo() { // 创建 OpenGL 帧缓冲区 GLCapabilities caps = new GLCapabilities(GLProfile.get(GLProfile.GL2)); panel = new GLJPanel(caps); panel.addGLEventListener(this); // 将 GLJPanel 添加到 JPanel 中 add(panel); } @Override public void init(GLAutoDrawable drawable) { // 初始化 OpenGL 渲染器 GL gl = drawable.getGL(); gl.glClearColor(1f, 1f, 1f, 1f); } @Override public void display(GLAutoDrawable drawable) { // 实现 OpenGL 渲染 GL gl = drawable.getGL(); gl.glClear(GL.GL_COLOR_BUFFER_BIT); gl.glBegin(GL.GL_TRIANGLES); gl.glColor3f(1f, 0f, 0f); gl.glVertex2f(-1f, -1f); gl.glColor3f(0f, 1f, 0f); gl.glVertex2f(0f, 1f); gl.glColor3f(0f, 0f, 1f); gl.glVertex2f(1f, -1f); gl.glEnd(); } @Override public void dispose(GLAutoDrawable drawable) { // 释放 OpenGL 资源 } @Override public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) { // 重新设置 OpenGL 视口 GL gl = drawable.getGL(); gl.glViewport(0, 0, width, height); } public static void main(String[] args) { JFrame frame = new JFrame("OpenGL Demo"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 300); frame.setLocationRelativeTo(null); // 添加 OpenGLDemo 到 JFrame 中 OpenGLDemo demo = new OpenGLDemo(); frame.add(demo); frame.setVisible(true); } } ``` 这个示例代码创建了一个 JFrame,其中包含一个 JPanel,在其中使用 JOGL 库创建了一个 GLJPanel 作为 OpenGL 帧缓冲区。在 GLEventListener 中实现了初始化、绘制等方法,并将 GLJPanel 添加到 JPanel 中。最后将 JPanel 添加到了 JFrame 中并显示出来。 运行这个程序,就可以看到一个简单的 OpenGL 渲染效果。这个示例只是一个简单的演示,实际上使用 JOGL 库实现更复杂的 OpenGL 渲染还需要更多的代码和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值