代码之家  ›  专栏  ›  技术社区  ›  LAX1DUDE svachon

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

  •  1
  • LAX1DUDE svachon  · 技术社区  · 7 年前

    我用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);
    

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

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

    1 回复  |  直到 7 年前
        1
  •  1
  •   LAX1DUDE svachon    7 年前

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

    推荐文章