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

Java LWJGL OpenGL异常访问冲突0xc0000005

周通
2023-03-14

当调用glDraweElements()时,我得到了一个错误,我不知道为什么:/I是使用OpenGL的新手,我正在尝试了解它的工作原理。

注意:我正在使用此库将OBJ文件转换为OpenGL应该能够使用的数组:https://github.com/korre/java-obj-to-opengl/blob/master/MeshObjectLoader.java

public class Mesh {

    private int vaoId;

    private List<Integer> vboIdList = new ArrayList<>();

    @Getter
    @Setter
    private float scale = 1;

    @Getter
    @Setter
    private Vector3f position = new Vector3f(0, 0, 0);

    @Getter
    @Setter
    private Vector3f rotation = new Vector3f(0, 0, 0);

    @Getter
    @Setter
    private String textureKey;

    private int vertexCount;

    private Mesh(MeshObjectLoader.MeshArrays meshArrays) {
        vaoId = glGenVertexArrays();
        glBindVertexArray(vaoId);

        var vboId = 0;
        vertexCount = meshArrays.getNumVertices();

        // Load vertices
        vboId = glGenBuffers();
        vboIdList.add(vboId);
        var vertexBuffer = (FloatBuffer) meshArrays.getVertices();
        glBindBuffer(GL_ARRAY_BUFFER, vboId);
        glBufferData(GL_ARRAY_BUFFER, vertexBuffer, GL_STATIC_DRAW);
        glVertexAttribPointer(0, 3, GL_FLOAT, false, 0 ,0);

        // Load texture coordinates
        vboId = glGenBuffers();
        vboIdList.add(vboId);
        var textureCoordsBuffer = (FloatBuffer) meshArrays.getTexCoords();
        glBindBuffer(GL_ARRAY_BUFFER, vboId);
        glBufferData(GL_ARRAY_BUFFER, textureCoordsBuffer, GL_STATIC_DRAW);
        glVertexAttribPointer(1, 2, GL_FLOAT, false, 0, 0);

        // Clean everything up
        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindVertexArray(0);
    }

    public static Mesh loadFromObjFile(String resourcePath) throws IOException {
        try (var resourceStream = Mesh.class.getResourceAsStream(resourcePath)) {
            return new Mesh(MeshObjectLoader.loadModelMeshFromStream(resourceStream));
        }
    }

    public void render(int textureId) {
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, textureId);

        glBindVertexArray(vaoId);
        glEnableVertexAttribArray(0);
        glEnableVertexAttribArray(1);

        glEnable(GL_DEPTH_TEST);
        glDrawElements(GL_TRIANGLES, vertexCount, GL_UNSIGNED_INT, 0);

        glDisableVertexAttribArray(0);
        glDisableVertexAttribArray(1);
        glBindVertexArray(0);
    }

    public void cleanup() {
        glDisableVertexAttribArray(0);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        for (int vboId : vboIdList) {
            glDeleteBuffers(vboId);
        }

        glBindVertexArray(0);
        glDeleteVertexArrays(vaoId);
    }

}

共有1个答案

公良云
2023-03-14

崩溃的原因是你从来没有将一个缓冲区对象绑定到VAO的< code > GL _ ELEMENT _ ARRAY _ BUFFER 绑定点,所以< code>glDrawElements的最后一个参数(...,0)被解释为主机地址指针,而不是任何元素数组缓冲区中的字节偏移量。当然,解引用< code>0地址会失败。

每当您调用像glDrawElements这样的索引绘制调用时,您还需要一个元素数组缓冲区(也称为“索引缓冲区”)。

该库返回位置、纹理坐标和法线的列表,您只需通过 glDrawArrays() 执行非索引绘制调用即可。这也是波前OBJ加载器的典型特征,因为波前OBJ格式具有位置,法线和纹理坐标的单独索引,因此典型的加载无论如何都会对所有人脸索引进行交叉乘积,并为您提供顶点数据的线性/重复列表。

所以:请改用< code>glDrawArrays。

 类似资料:
  • 问题内容: 这是使用内存映射将值写入内存的代码。当我尝试运行代码时, 在memcpy(pBuf,szMsg,len(szMsg))OSError中 出现错误 “文件“ MMF.py”,第26行,OSError:异常:访问冲突写入0xFFFFFFFFFA1C001B” 问题答案: 在此之前,这里(几乎)是您需要的一切:[Python 3.Docs]:ctypes- Python的外部函数库 。没有解

  • http://www.youtube.com/watch?v=bWl98dhvf8Q我参考了这个网站,并添加了MP4视频到javafx程序,我得到了一个致命的错误,有人请帮我清除这个运行时错误!谢谢你... Java运行时环境检测到一个致命错误:pc=0x6b9589ec,pid=1812,tid=5132 JRE版本:7.0_10-b17 Java VM:Java HotSpot(TM)客户端V

  • 我试图在OSGi(Felix)中使用新的Leap运动传感器,但我最终遇到了一个异常访问冲突。 在我的清单中,我声明捆绑NativeCode如 当然: 在OSGi之外使用相同库的简单程序运行良好 这两个库在“x86”文件夹中的我的包中 “osname=win32;processor=x86”适合我(已经用其他bunble进行了测试) 在反编译Leap Motion jar后,我看到LeapJava.

  • 我试图在C语言中实现一个四叉树,但是我有一个读访问冲突,我花了几个小时试图弄清楚。请注意,我已将所有成员变量公开,仅用于调试工作。 每当我试图细分一个象限,即根象限,我得到 抛出异常:读取访问冲突。标准::_Vector_alloc 四叉树由一个指向连续象限数组的指针和点组成。这些指针被传递到每一个象限,所以它们能够写入而不需要复制。 我做错了什么?你能提出改进的建议吗? 这是我的四叉树类: 四叉

  • 作为一个新的反应者,我被一些看似简单的事情所困扰。不知道我做错了什么。 我有一个组件BasicReactComponent。我喜欢这样: 我试图在我的主文件中调用它,如下所示: 我一直得到下面的错误

  • 尝试使用AWS C++SDK创建SQS队列。 运行在Windows上,64位,VC++。 更改调用以使用AWS::SQS::SQSClient*,将所有NuGet包更新到latets版本(以X.60结束)。这是堆栈跟踪: Testdb.exe!AmazonSQSqueue::AmazonSQSqueue(std::Basic_String,std::Allocator>queueIdentifie