glTexImage3D выдает исключение

#c #opengl #glew

#c #opengl #glew

Вопрос:

Я пытаюсь скомпилировать это приложение в VS13. Я связал все библиотеки следующим образом: glew32.lib из glew-1.10.0 lib Release Win32 put glew32.dll в той же папке, что и связанный с Debug glfw3

Когда я запускаю этот код, он генерирует исключение в glTexImage3D; в нем говорится: «Место выполнения 0x00000000 с нарушением доступа».

     #include <GL/glew.h>
#include <GL/glfw3.h>

#include <cstdlib>
#include <iostream>

GLenum volumeTexture;

int main() {
    // Initialize GLFW
    if (!glfwInit()) {
        std::cerr << "Failed to initialize GLFW! I'm out!" << std::endl;
        exit(-1);
    }

    glewExperimental = GL_TRUE;
    GLenum err = glewInit();

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

    }

    // Use red to clear the screen
    glClearColor(1, 0, 0, 1);
    glGenTextures(1, amp;volumeTexture);
    glBindTexture(GL_TEXTURE_3D, volumeTexture);

    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 256, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  

Я заметил, что ошибка устраняется, если я добавляю

 glTexImage3D = (PFNGLTEXIMAGE3DPROC) wglGetProcAddress("glTexImage3D");
  

но затем я получаю такое же исключение позже при запуске glGenFramebuffers (я получаю его, даже если я комментирую строку glTexImage3D)
Я что-то неправильно связываю?

Комментарии:

1. GL — это C API, он не генерирует исключения. Ваша ОС может вызывать исключение, если, например, вы пытаетесь вызвать функцию, представленную в виде NULL указателя, но это что-то другое.

Ответ №1:

Ваша последовательность неверна.

glewInit() для выполнения своих функций требуется текущий контекст GL. Без текущего контекста он не может запрашивать GL для точек входа и оставляет для всех своих указателей на функции (например, glTexImage3D() ) значение NULL.

glfwInit() НЕ создает контекст GL и не делает его текущим.

Вам нужно glfwCreateWindow() и glfwMakeContextCurrent() для этого.