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

使用Windows时在glDrawEltions上EXCEPTION_ACCESS_VIOLATION

上官修文
2023-03-14

我在用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安装一切正常时,这意味着这是特定于操作系统的。为了验证我让我的朋友在他的windows 10机器上测试了它,他还得到了EXCEPTION_ACCESS_VIOLATION。

TL;DR:上面的代码适用于Linux,但在Windows上会导致EXCEPTION_ACCESS_VIOLATION JVM崩溃

共有1个答案

濮嘉茂
2023-03-14

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

 类似资料:
  • 问题内容: 我想知道如何在Windows XP 32位上使用PyPy 1.8。我从网站上下载了zip文件,并将其安装到“我的文档”文件中。最初,我认为它与psyco类似,因为我必须“导入psyco”,但是我发现PyPy.exe的行为类似于Python命令行。 我尝试将脚本拖到PyPy.exe中运行它们,但似乎根本不起作用。尝试在PyPy中使用“ python”命令会产生“未定义全局名称’pytho

  • 问题内容: 我想使用VKCOM / noverify来分析代码。使用此命令从命令行(Windows dos shell)调用它 问题是我无法将参数传递给 我尝试了什么 您可以在此摘要中找到我的源代码。尽管分隔符在上方为空,但似乎args是以字符串分隔的形式加入的。 问题 如何将多个参数传递给 为什么我的尝试在Windows上不起作用? 问题答案: 有多个选项可以将参数传递给exec.Command

  • 我下载了Python 3.6.1,它预装了Pip。我写了这个命令来安装Numpy 我得到了这个作为输出: 收集Numpy无法获取URLhttps://pypi.python.org/simple/numpy/:确认ssl证书时出现问题:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl. c: 749)-跳过无法找到满足要求的版本Numpy(来自版本:)麻木 我如

  • 我正在尝试在windows 10上安装tensorflow,并遵循以下链接:https://www.tensorflow.org/install/install_sources 我已经成功安装了bazel。问题是当我使用这个命令时 要安装tensorflow,msys显示以下错误。 错误:C:/compiler/tensorflow/tensorflow/python/BUILD:4855:1:没

  • 我正在使用Swing为Java构建一个带有JCombobox的简单GUI。GUI加载到我的电脑上,但在我的合作伙伴苹果电脑上导致NullPointerException。 我尝试打印出JComboBox,收到以下“无效”消息。有人知道什么可能导致“...无效,布局...”以及为什么JComboBox会在Apple而不是Windows笔记本电脑上导致NullPointerException吗? 当我

  • 我用的是水蟒4.3。Windows 10 64位上的1 64位。我已经成功地安装了Tensorflow(CPU)根据这一点。测试程序在命令行中运行,但不在PyCharm中运行。问题是它只适用于激活tensorflow。 我遵循了Pycharm anaconda import tensor flow library问题中的步骤(“您需要执行以下步骤:”)。现在看来tensorflow已加载,但我得到