Ошибка нарушения доступа при вызове glGetString - PullRequest
0 голосов
/ 22 февраля 2019

Я создаю приложение OpenGL на C ++, используя SDL2 + GLAD.В моей основной функции у меня есть следующий код:

#include <iostream>
#include <SDL.h>

#include <glad\glad.h>

int main(int argc, char *argv[]) {
    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        std::cout << "SDL could not be initialized.";
        return 1;
    }

    SDL_GL_LoadLibrary(nullptr);

    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);

    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 5);

    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

    SDL_Window *window = SDL_CreateWindow("Hello world", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 500, 500, SDL_WINDOW_OPENGL);

    if (window == nullptr) {
        std::cout << "SDL could not open window";
        return 1;
    }

    const SDL_GLContext context = SDL_GL_CreateContext(window);

    if (context == nullptr) {
        std::cout << "SDL could not create context";
        return 1;
    }

    printf("OpenGL loaded\n");

    printf("Vendor:          %s\n", glGetString(GL_VENDOR));
    printf("Renderer:        %s\n", glGetString(GL_RENDERER));
    printf("Version OpenGL:  %s\n", glGetString(GL_VERSION));
    printf("Version GLSL:    %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_CULL_FACE);

    int w, h;
    SDL_GetWindowSize(window, &w, &h);
    glViewport(0, 0, w, h);
    glClearColor(0.0f, 0.5f, 1.0f, 0.0f);

    SDL_Event event;
    bool quit = false;
    while (!quit) {
        SDL_GL_SwapWindow(window);
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_QUIT) {
                quit = true;
            }
        }
    }

    return 0;
}

Однако, когда я запускаю это, я получаю следующую ошибку:

Exception thrown at 0x0000000000000000 in TestApp.exe: 0xC0000005: Access violation executing location 0x0000000000000000.

Сообщение OpenGL loadedнапечатано, и Visual Sutio показывает, что ошибка выдается в строке printf("Vendor:%s\n", glGetString(GL_VENDOR));.

Я удостоверился, что правильно связал SDL2 и GLAD в окне свойств решения.Что может быть причиной этой ошибки?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Рад Генератор загрузчика должен быть инициализирован либо gladLoadGL, либо gladLoadGLLoader, сразу после создания и создания текущего контекста OpenGL с помощью SDL_GL_CreateContext.

См. Также Библиотека загрузки OpenGL - рад

Например:

const SDL_GLContext context = SDL_GL_CreateContext(window);
if (context == nullptr) {
    std::cout << "SDL could not create context";
    return 1;
}

if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
    std::cout << "Failed to initialize OpenGL context" << std::endl;
    return -1;
}

printf("OpenGL loaded\n");

printf("Vendor:          %s\n", glGetString(GL_VENDOR));
printf("Renderer:        %s\n", glGetString(GL_RENDERER));
printf("Version OpenGL:  %s\n", glGetString(GL_VERSION));
printf("Version GLSL:    %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
0 голосов
/ 22 февраля 2019

Если генерируется ошибка, glGetString возвращает 0. И тогда printf - это попытка доступа к памяти по адресу 0. Или glGetString недоступен, поскольку библиотека OpenGL не загружена.Так что, вероятно, у вас есть проблемы с инициализацией OpenGL.Попробуйте указать полный путь к модулю DLL OpenGL в SDL_GL_LoadLibrary

. Пожалуйста, убедитесь, что SDL_GL_LoadLibrary возвращает 0, в противном случае вызовите SDL_GetError() для получения дополнительной информации.

...