Получение исключения нарушения доступа в сообществе Visual Studio с glfw3 glew и opengl - PullRequest
0 голосов
/ 24 января 2019

У меня уже давно есть эта проблема, и я не могу ради любви ко мне найти решение.

Я хочу сделать простой треугольник. Но я продолжаю получать этот вывод в Visual Studio при компиляции программы.

ПРИМЕЧАНИЕ> Я не верю, что это не проблема связывания, а что-то еще. Я проверил мой компоновщик бесчисленное количество раз, и все есть!

ССЫЛКА: https://pastebin.com/xeTDd0Qu

1010 * Основной *

static const GLfloat g_vertex_buffer_data[] = {
    100.0f, 100.0f, 0.0f,
    150.0f, 100.0f, 0.0f,
    100.0f, 150.0f, 0.0f,
};



GLFWwindow* window;
window = initWindow(640, 480, "Title");


GLuint VertexArrayID;
glGenVertexArrays(1, &VertexArrayID);
glBindVertexArray(VertexArrayID);


GLuint vertexbuffer;
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), g_vertex_buffer_data, GL_STATIC_DRAW);

while (!glfwWindowShouldClose(window)) {

    glViewport(0, 0, 640, 480);
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    glDrawArrays(GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);

    glFlush();

    glfwSwapBuffers(window);
    glfwPollEvents();
}

glfwTerminate();

return 0;

initWindow ()

GLFWwindow* initWindow(int a_width, int a_height, const char* title) {
glewExperimental = GL_TRUE;
int err = glewInit();
if (!err) {
    exit(-1);
}

if (!glfwInit()) {
    printf("glfwInit() failed!");
    return nullptr;
}

GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);

if (!window) {
    glfwTerminate();
    return nullptr;
}

return window;

}

Спасибо!

РЕДАКТИРОВАТЬ: Сообщение об исключении я получаю: В ConvexHullVisualiser.exe выдано исключение 0x00000000: 0xC0000005: расположение выполнения нарушения прав доступа 0x00000000.

1 Ответ

0 голосов
/ 24 января 2019

Полученная ошибка говорит о том, что вы пытаетесь выполнить указатель функции, который указывает на NULL. Большинство функций OpenGL являются (на окнах) указателями на функции и загружаются во время выполнения. В целом это означает, что вы пытаетесь выполнить функцию OpenGL, которая не была загружена.

Скорее всего, это происходит потому, что GLEW может быть успешно инициализирован только при наличии действительного контекста OpenGL. Поскольку контекст создается glfwCreateWindow, после этой строки необходимо вызывать glewInit.

Вам также не хватает вызова glfwMakeContextCurrent для привязки контекста OpenGL в активную ветку.

if (!glfwInit()) {
    printf("glfwInit() failed!");
    return nullptr;
}

GLFWwindow* window = glfwCreateWindow(640, 480, "My Title", NULL, NULL);

if (!window) {
    glfwTerminate();
    return nullptr;
}

glfwMakeContextCurrent(window);

glewExperimental = GL_TRUE;
int err = glewInit();
if (!err) {
    exit(-1);
}

Обратите внимание, что glewInit возвращает не int, а GLenum. Правильная проверка ошибок должна выглядеть примерно так:

GLenum err = glewInit();
if (GLEW_OK != err)
{
  /* Problem: glewInit failed, something is seriously wrong. */
  fprintf(stderr, "Error: %s\n", glewGetErrorString(err));
  ...
}

Источник: GLEW Документация

...