Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Windows时GLDraweElements上的异常\u访问\u冲突_Java_Opengl_Lwjgl_Glfw - Fatal编程技术网

Java 使用Windows时GLDraweElements上的异常\u访问\u冲突

Java 使用Windows时GLDraweElements上的异常\u访问\u冲突,java,opengl,lwjgl,glfw,Java,Opengl,Lwjgl,Glfw,我正在使用Java8和LWJGL制作一个带有GLFW和OpenGL的游戏引擎。我有一个通用的IndexedVAO类,里面有我所有的VAO代码,以简化事情。以下是相关部分: 构造函数 GL30.glBindVertexArray(vertexArrayObject); GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, bufferObject); GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, i

我正在使用Java8和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);
绘图功能

    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机器上尝试了它,结果遇到了异常\u访问\u违反jvm崩溃。当我检查JVM崩溃时生成的hs_err_pid#####文件时,我发现错误是由对GLDraweElements的调用引起的。这是整个应用程序中的第一个GLDrainElements调用,对它进行注释只是将异常转移到下一个。我花了整个下午的时间到处移动代码,做研究,结果一无所获。它与着色器无关,glDrawArrays在它的位置工作,考虑到它在linux上工作良好,意味着它与任何顶点生成代码都无关,因为它都是相同的java代码

这两台机器之间的一个主要硬件差异是windows机器有一个较旧的radeon图形卡,linux机器有一个最新的geforce卡,两者都有最新的驱动程序。我在radeon机器上启动了linux,以查看供应商之间是否存在不一致,但当我等待30分钟让java安装完毕后,一切正常,这意味着这是特定于操作系统的。为了验证,我让我的朋友在他的Windows10机器上测试了它,他也得到了异常访问违规


TL;DR:上面的代码在linux上运行,但在windows上它会导致异常访问违反jvm崩溃

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

您是否有有效的OpenGL上下文>3.0请求@斯佩克特:是的,你可以在没有证据的情况下对窗户大喊大叫并声称(错误的)东西,或者你可以试着帮助op.@BDL如果你仔细看看,我试着帮助你。。。解决方案是重新安装正确的gfx驱动程序。这是Win10的一个臭名昭著的“bug”。。。除此之外(他们现在对驱动程序做了什么是可怕的),draw函数中的ACCESS_违规通常有两个原因之一:1)draw函数本身没有加载,因此程序试图执行空函数指针,或2)draw函数试图访问其大小以外的缓冲区。不幸的是,我们看不到VAO设置中传递的任何值,也看不到绘制了哪些数据。@Spektre是的,两台windows计算机都使用特定于供应商的驱动程序,不是windows update版本。@BDL我在glfw窗口提示中请求opengl 3.3上下文,打印opengl版本时说这是两台机器上的3.3核心配置文件