рад заставляет glfwSwapBuffers возвращать сообщение об ошибке

Код

#include <glad.h>
#include <glad.c>
#include <GLFW/glfw3.h>

int main()
{
    glfwInit();

    GLFWwindow* window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);
    }

    return 0;
}

Справочная информация
Моя операционная система - последняя версия Windows 10
Я использую Visual Studio v16.6.3 (последняя)
Я очень новичок (только что узнал о openGL сегодня) и пытаюсь научиться создавать графику с помощью openGL
Я использую рад и GLFW

Проблема
Предполагается, что программа порождает пустое неотвечающее окно.
За исключением запуска программы, окно создается, но затем команда glClear возвращает ошибку "Исключение, выброшенное на 0x0000000000000000 в Project1.exe: 0xC0000005: место выполнения нарушения прав доступа 0x0000000000000000".

То, что я пробовал
(безуспешно), комментируя проблемный код, заставило программу работать правильно
Я переустановил драйверы видеокарты
Я попытался установить кучу разных приятных комбинаций на сайте генератора
Я пробовал запускать программу в 32-битном и 64-битном (с использованием соответствующего битового типа GLFW)
Комментирование #include и привело к правильной работе программы

Изображения
программы Свойства:
. C / C++:
.. Общие:
. Linker:
.. Общие:
.. Вход:
Файлы:
. GLFW:
. Рад:

1 ответ

Решение

Поведение абсолютно правильное. Итак, что делает GLAD, так это#define glFoo glad_glFoo для каждой функции GL Foo в <glad.h>, с glad_glFooуказатель функции на соответствующий тип. Все указатели на функции инициализируются какNULL.

Итак, когда вы звоните glClear(GL_COLOR_BUFFER_BIT) ты действительно звонишь glad_glClear(GL_COLOR_BUFFER_BIT) который, конечно, заканчивается как адрес вызова 0:

"Исключение с кодом 0x0000000000000000 в Project1.exe: 0xC0000005: место выполнения нарушения прав доступа 0x0000000000000000 ".

Прежде чем вы сможете вызвать указатель на функцию GLAD, вы должны выполнить все следующие действия:

  • успешно позвонили gladInit пока у вас был активен контекст GL для вызывающего потока,
  • иметь тот же контекст GL, связанный с потоком, в котором вы вызываете свою функцию GL (или совместимый, но это зависит от платформы)
  • убедитесь, что функция GL действительно предоставляется реализацией, например
    1. путем проверки конкретной версии GL, которая гарантирует наличие этой функции 1.b) путем запроса конкретной требуемой версии GL во время создания контекста и выхода из строя, если она не выполняется
    2. путем проверки наличия расширений GL, которые требуют доступности этой функции
    3. с GLAD вы даже можете проверить NULL указатели, как, кстати, работает GLAD, гарантируется, что неNULLуказатель на функцию подразумевает наличие функции, поскольку GLAD внутренне выполняет 1. и 2. перед запросом указателя функции. Обратите внимание, что это неверно для основного механизма расширения GL. Вы можете запросить неподдерживаемую функцию, но реализация все равно может предоставить не-NULLуказатель на функцию в результате. Вызывается неопределенное поведение, если реализация не объявила о наличии этой функции через версию GL или строку (строки) расширения.

поскольку glClear присутствует в каждой версии GL с самого начала, весь ваш код отсутствует, это gladInit.

Другие вопросы по тегам