当前位置: 首页 > 知识库问答 >
问题:

Lwjgl 3、如何在当前线程中获取OpenGL上下文当前?

胡承悦
2023-03-14

我在LWJGL 3中使用OpenGL,我得到以下错误;

Exception in thread "main" java.lang.IllegalStateException: There is no OpenGL context current in the current thread.
    at org.lwjgl.opengl.GL.getCapabilities(GL.java:157)
    at org.lwjgl.opengl.GL11.getInstance(GL11.java:1390)
    at org.lwjgl.opengl.GL11.glClearColor(GL11.java:1842)
    at com.base.engine.RenderUtil.initGraphics(RenderUtil.java:13)
    at com.base.engine.Main.<init>(Main.java:14)
    at com.base.engine.Main.main(Main.java:24)

这是RenderUtil类,initGraphics是从我的主类的构造函数中调用的。在使用GLFW创建了一个窗口后,我还尝试调用initGraphics,该窗口也生成了类似的错误消息。

    package com.base.engine;
    
    import static org.lwjgl.opengl.GL11.*;
    import static org.lwjgl.opengl.GL30.*;
    
    public class RenderUtil {
    
        public static void clearScreen() {
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        }
    
        public static void initGraphics() {
            glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    
            glFrontFace(GL_CW);
            glCullFace(GL_BACK);
            glEnable(GL_CULL_FACE);
            glEnable(GL_DEPTH_TEST);
    
            glEnable(GL_FRAMEBUFFER_SRGB);
        }
    }

另外,我没有使用多线程。要创建一个窗口,我调用方法Window.createWindow(1366,768,"Test");from my main method."

    public static String createWindow(int width, int height, String title) {
        if (GLFW.glfwInit() == 0) {
            return "GLFW failed to initialise.";
        }

        GLFW.glfwWindowHint(GLFW.GLFW_SAMPLES, 4);
        window = GLFW.glfwCreateWindow(width, height, title,
                GLFW.glfwGetPrimaryMonitor(), 0);

        if (window == null) {
            GLFW.glfwTerminate();
            return "Failed to create window.";
        }

        GLFW.glfwMakeContextCurrent(window);
        return "GLFW has established a window.";
    }
I have tried putting `RenderUtil.initGraphics();` two different position in my main method, both resulting in errors.

        private boolean isRunning = false;
        private Game game;
    

        // This is the constructor
        public Main() {
            // Pos 1 - RenderUtil.initGraphics();
            isRunning = false;
            game = new Game();
        }

        public static void main(String[] args) {
            System.out.println(Window.createWindow(1366, 768, "Test"));
            // Pos 2 - RenderUtil.initGraphics();
            Main game = new Main();
            game.start();
        }

共有3个答案

司寇阳朔
2023-03-14

要初始化并使用LWJGL 3,您需要执行下一步(Kotlin中的代码):

import org.lwjgl.glfw.GLFW
import org.lwjgl.opengl.GL
import org.lwjgl.opengl.GL11
import org.lwjgl.system.MemoryUtil.NULL


class VersionInfo {

    var window: Long = NULL

    fun run() {
        initGl()

        // use openGL
        val glVersion = GL11.glGetString(GL11.GL_VERSION)
        println("GL version: $glVersion")
    }

    private fun initGl() {
        // check GLFW
        if (!GLFW.glfwInit()) {
            throw IllegalStateException("Can not initialize GLFW")
        }
        // create window
        window = GLFW.glfwCreateWindow(1024, 764, "glfw", NULL, NULL)
        // check window
        if (NULL == window) {
            GLFW.glfwTerminate()
            throw IllegalStateException("Can not create new GLFW window")
        }
        // make GL context in the current thread
        GLFW.glfwMakeContextCurrent(window)
        // create capabilities
        GL.createCapabilities()
    }

    companion object {
        @JvmStatic
        fun main(args: Array<String>) {
            VersionInfo().run()
        }
    }
}

有关更多信息,请参阅官方入门指南:http://www.lwjgl.org/guide或维基:https://github.com/LWJGL/lwjgl3-wiki/wiki

范志勇
2023-03-14

我知道这个帖子已经4年了,但是如果你们中的某个人仍然需要一个解决方案,请继续:

import org.lwjgl.glfw.*;
import org.lwjgl.opengl.*;

public class Main {
private static long window = 0;

public static void main(String[] args) {
    if(!GLFW.glfwInit()) {
        throw new RuntimeException("Cannot initialize OPenGL");
    }

    window = GLFW.glfwCreateWindow(1024, 764, "Ya yeet", 0, 0);
    if(0 == window) {
        GLFW.glfwTerminate();
        throw new RuntimeException("Cannot create window");
    }

    GLFW.glfwMakeContextCurrent(window);
    GL.createCapabilities();

    String glVersion = GL11.glGetString(GL11.GL_VERSION);
    System.out.println(glVersion);
}
}
阎成天
2023-03-14

添加对GLContext的调用。createFromCurrent()在方法的末尾。

这种方法需要在后台设置LWJGL GL**类使用的上下文。

编辑:

由于最近的nightly(3.0.0b#11),这不再有效,因为不再存在GLContext类。相反,添加GL。createCapabilities()在方法的末尾。

 类似资料:
  • 我正在使用Java和JLWGL开发一个有趣的世界编辑器。到目前为止,一切正常。现在我试着创建一个窗口,在那里我可以添加一个地形或一个新模型来使用。问题是,当我尝试从主线程创建地形时,它被创建并显示,但当我尝试通过按钮eventlistener调用它时,我得到了一个错误:在当前线程中找不到OpenGL上下文。我基本上知道我为什么会出错。我用来获取输入并单击按钮的框架没有opengl上下文。 我现在的

  • 问题内容: 我正在关注youtube上的教程,但是OpenGL存在我无法解决的问题。我不知道该如何解决。 主要 问题答案: 您需要调用glfwMakeContextCurrent将OpenGL上下文绑定到您的线程。LWJGL网站上也有一个工作示例。

  • 我正在使用入门示例(来自https://www.lwjgl.org/guide{which unchanged works fine}),但将其更改为使用OpenGL ES 3.0(出于与此问题无关的原因)。 我正在使用最新的LWJGL版本3.1.1,选择最小的OpenGL ES作为我的预设(从https://www.lwjgl.org/download)以及使用windows本机。(我正在运行W

  • 问题内容: 我正在使用一个有趣的世界编辑器,并使用Java和JLWGL。到目前为止一切正常。现在,我尝试创建一个窗口,可以在其中添加要使用的地形或新模型。问题是,当我尝试从主界面创建地形并创建并显示该地形时,但是当我尝试通过按钮事件监听器调用该地形时,出现错误: 在当前线程中未找到OpenGL上下文。 我基本上知道为什么会得到错误。我用来获取输入并单击按钮的框架没有opengl上下文。 现在的问题

  • 我想用。tmx文件作为TileMap 这是我的主要课程: 在intellij中编译程序时,我遇到了以下问题: 2017年6月20日星期二23:37:23 IRDT错误:在当前线程中未找到OpenGL上下文。JAVAlang.RuntimeException:在当前线程中找不到OpenGL上下文。在org。lwjgl。opengl。背景。getCapabilities(GLContext.java:

  • 问题内容: 我正在玩纸牌游戏,目前拥有良好的基础,但是在eclipse中运行它时遇到了错误。我也使用光滑的2d。 这是来自控制台的错误。 线程“主”中的异常java.lang.RuntimeException:在当前线程中找不到OpenGL上下文。在org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)在org.lwjgl.op