java - 使用 Windows 时 glDrawElements 上的 EXCEPTION_ACCESS_VIOLATION

标签 java opengl lwjgl glfw

我正在使用 Java 8 和 LWJGL 来制作带有 GLFW 和 OpenGL 的游戏引擎。我有一个通用的 IndexedVAO 类,其中包含我所有的 VAO 代码以简化事情。以下是相关部分:

构造函数

    GL30.glBindVertexArray(vertexArrayObject);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferObject);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
    for(VertexAttribPointer prr : format.parts) {
        GL20.glEnableVertexAttribArray(prr.index);
        GL20.glVertexAttribPointer(prr.index, prr.size, prr.type,
            prr.normalized, prr.stride, prr.ptr);
    }
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL30.glBindVertexArray(0);

上传功能

    data.flip();
    index.flip();
    this.numberOfIndicies = index.limit() / 2;
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferObject);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, data, bufferUse);
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, 0);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBufferObject);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, index, bufferUse);
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);

绘图函数

    GL30.glBindVertexArray(vertexArrayObject);
    GL11.glDrawElements(this.drawmode, this.numberOfIndicies, GL11.GL_UNSIGNED_SHORT, 0L);
    GL30.glBindVertexArray(0);

该代码在 Linux 上运行良好,但今天我在 Windows 机器上尝试了它,并遇到了 EXCEPTION_ACCESS_VIOLATION jvm 崩溃。当我检查 JVM 崩溃时生成的 hs_err_pid#### 文件时,我发现错误是由调用 glDrawElements 引起的。这是整个应用程序中的第一个 glDrawElements 调用,将其注释掉只是将异常移至下一个。我花了整个下午的时间来移动代码并进行研究,但一无所获。它与着色器无关,glDrawArrays 在它的位置工作,并且考虑到它在 Linux 上运行良好意味着它与任何顶点生成代码无关,因为它们都是相同的 java 代码。

两台机器之间的一个主要硬件差异是 Windows 机器具有较旧的 radeon 显卡,而 Linux 机器具有最新的 geforce 卡,两者都有最新的驱动程序。我在 radeon 机器上启动了 linux,以查看供应商之间是否存在不一致,但是当我等待 30 分钟等待 java 安装时,一切正常,这意味着这是特定于操作系统的。为了验证,我让我的 friend 在他的 Windows 10 机器上测试了它,他也得到了 EXCEPTION_ACCESS_VIOLATION。

TL; DR:上面的代码可以在 Linux 上运行,但在 Windows 上会导致 EXCEPTION_ACCESS_VIOLATION jvm 崩溃

最佳答案

感谢@derhass和@Spektre,问题是AMD的Windows驱动程序无法正确处理未在4字节边界上对齐的顶点组件,因此使用字节来存储法线或RGB颜色会使驱动程序崩溃,因为该组件只有三个字节长。奇怪的是,即使它是读取顶点数据的同一张卡,它在 Linux 上的工作方式也是如此。

关于java - 使用 Windows 时 glDrawElements 上的 EXCEPTION_ACCESS_VIOLATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52574606/

相关文章:

java - MySQL、Java 和 UTF8

c++ - 我可以在 glTexImage2D 调用后释放分配给 Image 的内存吗?

java - LWJGL Java 碰撞

java - 在appdynamics中监控java应用程序

java - Jooq LocalDateTime 字段使用系统时区而不是 session 时区

java - 扫描仪无法关闭

java - LWJGL:渲染天空盒的更有效方法

c++ - OpenGL + Visual Studio 2017 : rendering window not displayed (was OK with Visual 2010)

java - OpenGL 透视图沿 z 轴扭曲场景远超预期

java - 打开AL空指针异常