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

lwjgl 3,glUniformMatrix4导致jre崩溃

孙化
2023-03-14

我在用lwjgl 3,学习现代opengl (3)。我想发送一个统一的矩阵到顶点着色器,这样我就可以应用变换。我试过了,程序崩溃了,并出现了这个错误

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000073a9820d, pid=8644, tid=2760
#
# JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [nvoglv64.DLL+0xd5820d]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# E:\Copy\Code\Personal\atei-graphics\GraphicsProject\hs_err_pid8644.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

显然我做错了什么。

问题似乎出在这行代码上

    glUniformMatrix4(uniformMatrixLocation, false, mvp.getBuffer());

如果我删除这一行代码,程序会正确执行。< br >

我试着传递一个对角矩阵来检查问题是否出在矩阵本身,但还是得到了同样的结果

mvp是我传递给着色器的对角矩阵。< br> uniformMatrixLocation保持我用这行代码找到的位置

    glGetUniformLocation(shaderProgram.programId, "MVP");

它不返回负数,所以这里可能没有错误。

我将此库用于Mat4类
https://github.com/jroyalty/jglm

Bellow是我的代码的一个“工作”示例,尽可能小。

    //glfw create windows and etc

    int programId = glCreateProgram();

    int vertexShaderId = glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShaderId, FileUtils.readFile("shaders/vertex.glsl"));
    glCompileShader(vertexShaderId);
    if (glGetShaderi(vertexShaderId, GL_COMPILE_STATUS) == GL_FALSE) {
        throw new RuntimeException("Error creating vertex shader\n"
                + glGetShaderInfoLog(vertexShaderId, glGetShaderi(vertexShaderId, GL_INFO_LOG_LENGTH)));
    }
    glAttachShader(programId, vertexShaderId);
    int fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShaderId, FileUtils.readFile("shaders/fragment.glsl"));
    glCompileShader(fragmentShaderId);
    if (glGetShaderi(fragmentShaderId, GL_COMPILE_STATUS) == GL_FALSE) {
        throw new RuntimeException("Error creating vertex shader\n"
                + glGetShaderInfoLog(fragmentShaderId, glGetShaderi(fragmentShaderId, GL_INFO_LOG_LENGTH)));
    }
    glAttachShader(programId, fragmentShaderId);
    glLinkProgram(programId);
    if (glGetProgrami(programId, GL_LINK_STATUS) == GL_FALSE) {
        throw new RuntimeException("Unable to link shader program:");
    }

    /*
        Hold the location of the matrix in the shader
    */
    int uniformMatrixLocation = glGetUniformLocation(programId, "MVP");


    float[] vertices = {
        +0.0f, +0.8f, 0,
        -0.8f, -0.8f, 0,
        +0.8f, -0.8f, 0
    };

    int vaoId = glGenVertexArrays();
    glBindVertexArray(vaoId);

    FloatBuffer verticesBuffer = BufferUtils.createFloatBuffer(vertices.length);
    verticesBuffer.put(vertices).flip();

    int vboId = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboId);
    glBufferData(GL_ARRAY_BUFFER, verticesBuffer ,GL_STATIC_DRAW);

    glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
    glBindVertexArray(0);

    glClearColor(0,0,0,1);         
    while (glfwWindowShouldClose(window) == GL_FALSE) {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer
        glUseProgram(programId);

        Mat4 mvp = new Mat4(1.0f);//diagonal matrix , should just show a triangle on the screen

        /*
            Crashes here
        */
        //glUniformMatrix4(uniformMatrixLocation, false, mvp.getBuffer());

        glBindVertexArray(vaoId);
        glEnableVertexAttribArray(0);

        glDrawArrays(GL_TRIANGLES, 0, 3);

        glDisableVertexAttribArray(0);
        glBindVertexArray(0);

        glUseProgram(0);

        glfwPollEvents();
        glfwSwapBuffers(window); // swap the color buffers
    }

    //dispose stuff no point showing them here

顶点著色引擎

    #version 330 core


    layout(location = 0) in vec3 position;

    uniform mat4 MVP;

    void main(){

         gl_Position =  MVP*vec4(position,1);

    }

片段着色器

    #version 330 core

    out vec4 color;

    void main()
    {

         color = vec4(1,1,1,1);

    }

对不起,如果以前有人问过这个问题,我在网上搜索了一下,没有找到任何有用的东西。提前谢谢你。

共有1个答案

谯乐池
2023-03-14

崩溃很可能是因为您向 LWJGL 传递了从 Mat4 返回的堆上浮动缓冲区()。JWJGL 要求您直接向它传递缓冲区:

LWJGL 要求传递给它的所有 NIO 缓冲液都是直接缓冲液。直接缓冲区实质上包装指向堆外内存的地址,即本机指针。这是 LWJGL 将数据从 Java 代码安全地传递到本机代码的唯一方法,反之亦然,而不会降低性能。它不支持堆上 Java 数组(或包装它们的普通 NIO 缓冲区),因为当本机代码访问它们时,JVM 的垃圾回收器可能会在内存中移动数组。此外,Java数组具有未指定的布局,即它们在内存中不一定是连续的。

您可以像已经为顶点使用的那样使用BufferUtils类:

FloatBuffer matrixBuffer = BufferUtils.createFloatBuffer(16).put(mvp.getBuffer()).flip();

...

glUniformMatrix4(uniformMatrixLocation, false, matrixBuffer);

如果这不起作用,试试这个:

FloatBuffer matrixBuffer = BufferUtils.createFloatBuffer(16).put(new float[] {
    1.0f, 0.0f, 0.0f, 0.0f,
    0.0f, 1.0f, 0.0f, 0.0f,
    0.0f, 0.0f, 1.0f, 0.0f,
    0.0f, 0.0f, 0.0f, 1.0f}).flip();
 类似资料:
  • 我试图用LWJGL编写一个opengl渲染器。为了打开窗户,我用的是GLFW。但是,当我调用glfwCreateWindow时,它会崩溃,出现以下错误: Java运行时环境检测到一个致命错误: 谢了!

  • 问题内容: 我正在尝试创建一个node.js应用程序, 导致我的程序崩溃。节点说 ReferenceError:警报未定义 然后退出。我可以在常规html页面上运行javascript时使用该函数,因此我不知所措,这是为什么…这是我必须与node.js一起使用的单独模块吗? 问题答案: 该功能是浏览器对象的属性。它实际上不是JavaScript的一部分;它只是该环境中JavaScript代码可用的

  • 我试图从我的框架中获得轮廓,这就是我所做的: .................................................... 程序在处崩溃,我收到以下错误消息: OpenCV错误:不支持的格式或格式组合([开始]FindContour只支持8uC1和32sC1图像)在未知的功能,文件......\src\openc v\模块\imgproc\src\contours.cp

  • 我正在使用内置于Web View的Android开发浏览器。其中我面临的一个问题是,当我访问http://crashmybrowser.com测试浏览器上的选项卡崩溃时,我的整个浏览器应用程序都会崩溃。但是,当在chrome或Opera上进行相同的测试时,这些浏览器会在崩溃中幸存下来,并且只有特定的选项卡崩溃是由于访问上述网站而预期的结果。有人能帮助理解我如何在使用Webview的浏览器上处理此崩

  • 问题内容: 我已经使用线程编写了python tkinter代码,以便tkinter向导通过在主线程中运行的tkinter mainloop和在单独线程中运行的后台进程自动更新。但是我注意到,运行代码一段时间后python崩溃了。此外,它本质上是随机的,但python大部分时间都崩溃。我写了一个小的测试代码来显示这个问题(我的原始代码与此类似,但是具有一些实际的过程和许多其他功能,因此我将共享测试

  • 我正在使用来自ViewPager(在调用活动中)的活动转换,以及共享元素和内容转换。我得到这个崩溃时,重新进入调用活动: 此外,一旦返回,屏幕开始持续闪烁,白色屏幕来回闪烁。 以下是我的转换标志: 我尝试在调用和调用活动上设置进入/退出转换,但没有运气。