Исключение Opengl после glBufferData - PullRequest
1 голос
/ 28 сентября 2019

Я получаю Exception_access_violation из моей программы jogl.Пример кода содержит точку, в которой ошибка генерируется в соответствии с журналами (и проверяется с помощью Sys out).Я происходил прямо по вызову glBufferData для вершин.

Так что в настоящее время я объединяю меньшие сетки в одну большую, комбинируя вершины и корректируя индексы.Программа может работать с одинаковым количеством вершин, распределенных по нескольким сеткам (vaos), но после их объединения я получаю эту ошибку.Когда я рендерил комбинированный меш с меньшими вершинами, он также работает.

Когда он разбился, я загружаю меш с 24834 вершинами и 12618 индексами.Это слишком много для буфера?

public static int loadToGPU(Mesh mesh){


    GL4 gl = GLContext.getCurrentGL().getGL4();

    int[] vaoids = new int[1];
    gl.glGenVertexArrays(1,vaoids,0);


    int[] vboids = new int[3];
    gl.glGenBuffers(3,vboids,0);

    gl.glBindVertexArray(vaoids[0]);

    FloatBuffer verticesBuffer = FloatBuffer.allocate(mesh.vertices.length);
    verticesBuffer.put(mesh.vertices);
    verticesBuffer.flip();

    gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vboids[0]);
    gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.vertices.length * gl.GL_FLOAT ,verticesBuffer,gl.GL_STATIC_DRAW);
    gl.glEnableVertexAttribArray(0);
    gl.glVertexAttribPointer(0, 3, gl.GL_FLOAT, false, 0, 0);

    verticesBuffer.clear();
    verticesBuffer = null;

    IntBuffer indicesBuffer = IntBuffer.allocate(mesh.indices.length);
    indicesBuffer.put(mesh.indices);
    indicesBuffer.flip();

    gl.glBindBuffer(gl.GL_ELEMENT_ARRAY_BUFFER, vboids[1]);
    gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, mesh.indices.length * gl.GL_UNSIGNED_INT ,indicesBuffer,gl.GL_STATIC_DRAW);
    gl.glEnableVertexAttribArray(1);
    gl.glVertexAttribPointer(1, 3, gl.GL_UNSIGNED_INT, false, 0, 0);

    indicesBuffer.clear();
    indicesBuffer = null;

    FloatBuffer normalBuffer = FloatBuffer.allocate(mesh.normals.length);
    normalBuffer.put(mesh.normals);
    normalBuffer.flip();

    gl.glBindBuffer(gl.GL_ARRAY_BUFFER, vboids[2]);
    gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.normals.length * gl.GL_FLOAT ,normalBuffer,gl.GL_STATIC_DRAW);
    gl.glEnableVertexAttribArray(2);
    gl.glVertexAttribPointer(2, 3, gl.GL_FLOAT, false, 0, 0);

    normalBuffer.clear();
    normalBuffer = null;

    gl.glBindBuffer(gl.GL_ARRAY_BUFFER,0);
    gl.glBindVertexArray(0);


    return vaoids[0];

}

1 Ответ

1 голос
/ 28 сентября 2019

mesh.vertices.length * gl.GL_FLOAT не делает то, что вы ожидаете.
gl.GL_FLOAT является константой перечислителя, и ее значение не равно 4 (это 0x1406 соответственно 5126).Что вы на самом деле делаете, так это вычисляете mesh.vertices.length * 5126
Вы должны рассчитать размер буфера в байтах, поэтому вы должны умножить количество элементов на размер типа данных float :

gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.vertices.length * gl.GL_FLOAT, ...); gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.vertices.length * 4, ...);

Та же проблема возникает при создании и инициализации хранилища данных буфера элементов:

gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, mesh.indices.length * gl.GL_UNSIGNED_INT, ...);
gl.glBufferData(gl.GL_ELEMENT_ARRAY_BUFFER, mesh.indices.length * 4, ...);

и буфер вершин для векторов нормалей:

gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.normals.length * gl.GL_FLOAT, ...)
gl.glBufferData(gl.GL_ARRAY_BUFFER, mesh.normals.length * 4, ...)

...