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

当前线程中没有OpenGL ES上下文当前-LWJGL使用OpenGL ES 3.0

陈博容
2023-03-14

我正在使用入门示例(来自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本机。(我正在运行Windows 10 64位)

我卡住了--我不知道如何修复它,并让它运行。

我得到的错误是:

异常线程"main"java.lang.IllegalStateException:当前线程中没有OpenGL ES上下文当前。

完整的错误:

Exception in thread "main" java.lang.IllegalStateException: There is no OpenGL ES context current in the current thread.
at org.lwjgl.opengles.GLES.createCapabilities(GLES.java:222)
at com.test.desktop.HelloWorld.loop(HelloWorld.java:93)
at com.test.desktop.HelloWorld.run(HelloWorld.java:31)
at com.test.desktop.HelloWorld.main(HelloWorld.java:112)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

完整来源:

package com.test.desktop;

import org.lwjgl.*;
import org.lwjgl.glfw.*;
//import org.lwjgl.opengl.*;
import org.lwjgl.opengles.GLES;
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.opengles.GLES20.*;
import static org.lwjgl.opengles.GLES30.*;
import static org.lwjgl.system.MemoryStack.*;
import static org.lwjgl.system.MemoryUtil.*;

public class HelloWorld {

    // The window handle
    private long window;

    static final int WIDTH = 1024;
    static final int HEIGHT = 768;

    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(WIDTH, HEIGHT, "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 resolution of the primary monitor
        GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());

        // Center the window
        glfwSetWindowPos(
                window,
                (vidmode.width() - WIDTH) / 2,
                (vidmode.height() - HEIGHT) / 2
        );

        // 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.
        GLES.createCapabilities();
        // 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.opengl.*;

并且,更改:

GLES.createCapabilities();

并且,使用以下内容代替:

GL.createCapabilities();

我发现这个错误:

线程"main"中的异常java.lang.IllegalStateException:没有为当前线程设置GLES能力实例。可能的解决方案

共有1个答案

谢海阳
2023-03-14

设法找到解决方案(从http://bedroomcoders.co.uk/gles2-0-everywhere-thanks-to-lwjgl3/).

我取消评论:

import org.lwjgl.opengl.*;

在init()函数中调用glfwCreateWindow函数之前,添加了:

glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);

并且,将以下内容添加到init()函数的末尾:

// Bypasses the default create() method.
Configuration.OPENGLES_EXPLICIT_INIT.set(true);
GLES.create(GL.getFunctionProvider());

这是因为它使用组织。lwjgl。打开。总账功能地址而不是组织。lwjgl。打开。格尔斯。在Windows上,他们使用OpenGL本机函数地址,而不管(有些例外)。

“OpenGL 4.3与OpenGL ES 3.0完全兼容”(来自https://en.wikipedia.org).

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

  • 我在LWJGL 3中使用OpenGL,我得到以下错误; 这是RenderUtil类,initGraphics是从我的主类的构造函数中调用的。在使用GLFW创建了一个窗口后,我还尝试调用initGraphics,该窗口也生成了类似的错误消息。 另外,我没有使用多线程。要创建一个窗口,我调用方法from my main method."

  • 我刚刚开始使用LWJGL和OpenGL,我遇到了一个问题。我正试图弄清楚如何为我正在使用我找到的游戏引擎制作的游戏绘制一条简单的线。 这是指向我使用的引擎的链接:https://github.com/SilverTiger/SilenceEngine 在渲染器类中,我尝试添加这个函数- 我得到的错误如下: 我对这个很陌生,不知道如何解决这个问题。

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

  • 此错误发生在,当方法运行时。 向添加注释不能解决问题-https://stackoverflow.com/a/32552558/3536552 你知道怎么修吗?