glDrawArrays нарушение прав доступа

Я пытаюсь следовать [этому] [1] простому руководству, но получаю следующую ошибку при достижении 'glDrawArrays':

Необработанное исключение по адресу 0x03D7598E (nvoglv32.dll) в openGLTest.exe: 0xC0000005: место чтения нарушения прав доступа 0x00000000.

void createMesh(void) {
    float* vertices = new float[18];// Amount of vertices

    vertices[0] = -0.5; vertices[1] = -0.5; vertices[2] = 0.0; // Bottom left corner
    vertices[3] = -0.5; vertices[4] = 0.5; vertices[5] = 0.0; // Top left corner
    vertices[6] = 0.5; vertices[7] = 0.5; vertices[8] = 0.0; // Top Right corner

    vertices[9] = 0.5; vertices[10] = -0.5; vertices[11] = 0.0; // Bottom right corner
    vertices[12] = -0.5; vertices[13] = -0.5; vertices[14] = 0.0; // Bottom left corner
    vertices[15] = 0.5; vertices[16] = 0.5; vertices[17] = 0.0; // Top Right corner

    glGenVertexArrays(1, &vaoID[0]); // Create our Vertex Array Object
    glBindVertexArray(vaoID[0]); // Bind our Vertex Array Object so we can use it

    glGenBuffers(1, vboID); // Generate our Vertex Buffer Object
    glBindBuffer(GL_ARRAY_BUFFER, vboID[0]); // Bind our Vertex Buffer Object
    glBufferData(GL_ARRAY_BUFFER, 18 * sizeof(GLfloat), vertices, GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW

    glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0); // Set up our vertex attributes pointer

    glEnableVertexAttribArray(0); // Disable our Vertex Array Object
    glBindVertexArray(0); // Disable our Vertex Buffer Object

    delete[] vertices; // Delete our vertices from memory

    glBindVertexArray(vaoID[0]); // Bind our Vertex Array Object

    glDrawArrays(GL_TRIANGLES, 0, 6); // Draw our square

    glBindVertexArray(0); // Unbind our Vertex Array Object 
}

Я в недоумении, что вызывает это, так как учебник тот же!


person Calco    schedule 19.01.2016    source источник
comment
Я все еще просматриваю код, но подозреваю, что произойдет, если вы удалите delete[] vertices;?   -  person Xirema    schedule 19.01.2016
comment
Я удалил его, но все равно происходит то же нарушение прав доступа.   -  person Calco    schedule 19.01.2016
comment
Хорошо. OpenGL делает забавные вещи за кулисами, поэтому лучше исключить подобные вещи.   -  person Xirema    schedule 19.01.2016
comment
Вы можете опубликовать весь код, включая основной метод. Функция initGL() выглядит немного подозрительно, но я не могу знать этого наверняка, пока не увижу, как она вызывается из основной функции.   -  person Xirema    schedule 19.01.2016
comment
Я экспериментировал с перемещением glewInit, но безрезультатно. Код размещен выше, за исключением методов, которые не имеют ничего общего с OpenGL. Эта простая часть рисования прямоугольника — единственная проблема OpenGL, которая, кажется, проявляется, поскольку я могу рисовать точки и линии без проблем. Вот что работает: ПРИМЕР ВИДЕО   -  person Calco    schedule 19.01.2016
comment
Когда вы вызываете здесь glDrawArrays, привязываете ли вы шейдер? Похоже, что эта функция не должна выполнять никакого рендеринга, поскольку она называется createMesh. Вы уверены, что все остальные необходимые состояния настроены правильно при вызове glDrawArrays?   -  person Sam    schedule 20.01.2016


Ответы (3)


При работе с OpenGL место чтения Access Violation 0 обычно означает, что ваши подключения к OpenGL API не установлены должным образом. Правильно ли настроен GLEW в вашем коде? Вы позвонили glewInit() и убедились, что результат равен GL_TRUE? Вызывается ли glewInit() до или после того, как вы сделаете контекст текущим? Проверьте все эти вещи, и это должно решить проблему.

person Xirema    schedule 19.01.2016
comment
Я вызываю glewInit() в своем методе 'int InitGL(GLvoid)', который устанавливает такие вещи, как 'glShadeModel(GL_SMOOTH)' или 'glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST)'. Это не слишком рано, не так ли? Он дает GLEW_OK и, кажется, не попадает в проверку ошибок. Обновлен основной вопрос, чтобы показать это. - person Calco; 19.01.2016

После долгих экспериментов я исправил эту проблему, изменив первую строку на:

float vertices[18];

и удаление:

delete[] vertices;
person Calco    schedule 19.01.2016
comment
Возможно, вы не исправили его, а вместо этого усложнили воспроизведение ошибки. - person Sam; 20.01.2016

У меня была такая же ошибка, когда я использовал glDraw. Я исправил это, сначала привязав VertexArray, а затем IndexBuffer

person Gaba Miau    schedule 23.07.2021