【问题标题】:Java fatal error when calling glDrawElements()调用 glDrawElements() 时出现 Java 致命错误
【发布时间】:2015-03-21 17:59:21
【问题描述】:

我第一次遇到这个问题,今天之前一切正常。在我看来,问题出在内存管理或类似问题上。

我将所有 opengl 代码压缩在一个类中,我从主窗口循环调用该类。还是一样的错误。

public class renderTest 
{
public float[] vertices(int x, int y, int z)
{
    float vertices[] = 
        {
            //...
        };
    return vertices;
}

public final int[] indices = 
    {   
     //...
    };

public Model model;

public renderTest()
{
    this.model = loadToVAO(vertices(0, 0, -5), indices);

}
public void render(Model model)
{

glBindVertexArray(model.getVaoID());
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glDrawElements(GL_QUADS, model.getVertexAmount(), GL_UNSIGNED_INT, 0); // <<< FATAL ERROR HERE
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, 0);                               // <<< OR HERE
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glBindVertexArray(0);
}

public Model loadToVAO(float[] vertices, int [] indices)
{
    int vaoID = create();
    bindIndicesBuffer(indices);
    storeDataInAttributeList(0, vertices, 3);
    //storeDataInAttributeList(1, textureCoords, 2);
    unbind();
    return new Model(vaoID, indices.length);
}

private int create() 
{
    int ID = glGenVertexArrays();
    glBindVertexArray(ID);
    return ID;
}

private void storeDataInAttributeList(int attributeNumber, float[] data, int coordinateSize) 
{
    int vboID = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    FloatBuffer buffer = storeDataInFloatBuffer(data);
    glBufferData(GL_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
    glVertexAttribPointer(attributeNumber, coordinateSize, GL_FLOAT, false, 0, 0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

private FloatBuffer storeDataInFloatBuffer(float[] data) 
{
    FloatBuffer buffer = BufferUtils.createFloatBuffer(data.length);
    buffer.put(data);
    buffer.flip();
    return buffer;
}

private IntBuffer storeDataInIntBuffer(int[] data)
{
    IntBuffer buffer = BufferUtils.createIntBuffer(data.length);
    buffer.put(data);
    buffer.flip();
    return buffer;
}

private void bindIndicesBuffer(int[] indices)
{
    int vboID = glGenBuffers();
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboID);
    IntBuffer buffer = storeDataInIntBuffer(indices);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer, GL_STATIC_DRAW);
}

private void unbind()
{
    glBindVertexArray(0);
}

}

Java 运行时环境检测到致命错误:

PC=0x0000000055cdb5c0, pid=5200, tid=4540 处的 EXCEPTION_ACCESS_VIOLATION (0xc0000005)

JRE 版本:Java(TM) SE 运行时环境 (8.0_40-b26)(内部版本 1.8.0_40-b26)

Java VM:Java HotSpot(TM) 64 位服务器 VM(25.40-b25 混合模式 windows-amd64 压缩 oops)

有问题的框架: C [atio6axx.dll+0x23b5c0]

无法写入核心转储。默认情况下,在 Windows 的客户端版本上不启用小型转储

崩溃发生在 Java 虚拟机之外的本地代码中。 请参阅有问题的框架以了解报告错误的位置。

【问题讨论】:

  • 您使用的是哪个版本的 LWJGL?
  • 2.9.1,我试试 lwjgl 3。
  • 请注意 LWJGL 3 使用全新的窗口系统 (GLFW),因此如果您之前从未使用过它,可能需要一段时间才能适应。另请参阅my answer to another question
  • 是的,因此我安装了最终的 lwjgl 2 build (2.9.3),但没有任何改变。
  • 我不知道该怎么办。

标签: java render lwjgl fatal-error


【解决方案1】:

最后,我想通了。问题出在这两行代码中:

glEnableVertexAttribArray(1);
//...
glDisableVertexAttribArray(1);

我启用了一个不存在的 VAO。真傻。

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2021-09-06
    • 2019-02-16
    相关资源
    最近更新 更多