OpenGL - 'glTexSubImage3D': идентификатор не найден

0

Проблема: я пытался выяснить эту ошибку в OpenGL, которую я продолжаю получать с помощью glTexSubImage3D. VS2010 выдает ошибку: glTexSubImage3D: identifier not found

Использование: Я пытаюсь создать трехмерную текстуру с десятью срезами (изображениями), расположенными вдоль z-размерности. Это похоже на вопрос в этом сообщении: C++ - размещать несколько изображений в указателе массива

Тем не менее, я пытаюсь использовать glTexSubImage3D, чтобы избежать этих ошибок доступа.

Я включил glext.h в свой проект, и поскольку glTexImage3D еще не является частью библиотек OpenGL, я использовал указатель на функцию PFNGLTEXIMAGE3DPROC glTexImage3D как это предусмотрено для использования здесь: http://content.gpwiki.org/index.php/OpenGL: Учебники: 3D_Textures

Код:

Я слежу за учебником по отображению текстур NeHe и учебником по предоставлению тома, представленным здесь: http://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering?msg=4729498

GLuint m_nTexId;            
unsigned char *tex;

int h = 1024;               
int w = 256;
int slices = 10;

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

int LoadGLTextures()                                    
{
    glGenTextures(1,(GLuint*)&m_nTexId );

    if(m_nTexId == 0)
    return false;

    glBindTexture( GL_TEXTURE_3D, m_nTexId );
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
    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);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);


    glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, w, h , slices, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL );

    tex = (unsigned char *)SOIL_load_image("Data/PA_170090.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char*) SOIL_load_image("Data/PA_170091.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 1, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char *)SOIL_load_image("Data/PA_170092.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 2, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char *)SOIL_load_image("Data/PA_170093.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 3, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char *)SOIL_load_image("Data/PA_170094.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 4, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char *)SOIL_load_image("Data/PA_170095.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 5, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char*) SOIL_load_image("Data/PA_170096.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 6, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char*) SOIL_load_image("Data/PA_170097.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 7, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char*) SOIL_load_image("Data/PA_170098.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 8, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);

    tex = (unsigned char*) SOIL_load_image("Data/PA_170099.png", &w, &h, NULL, 0);
    glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 9, h, w, 1, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) tex);
//glBindTexture( GL_TEXTURE_3D, 0 );

    return true;

}

Теги:
opengl

1 ответ

1
Лучший ответ

Проблема такая же, как у вас, когда вы изначально пытались использовать glTexImage3D (...). А именно, 3D-текстуры - это функция OpenGL 1.2, а Windows дает вам OpenGL 1.1 без расширения времени выполнения.

Вам нужно загрузить glTexSubImage3D (...) же, как и glTexImage3D (...).

PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D =
 (PFNGLTEXSUBIMAGE3DPROC) wglGetProcAddress("glTexSubImage3D");
  • 0
    Черт, мне пришлось использовать PFNGLTEXSUBIMAGE3DPROC вместо PFNGLTEXIMAGE3DPROC что я и пытался все время! Тем не менее я все еще получаю ошибки нарушения доступа в glTexImage3D() : 0xC0000005: Access violation.
  • 0
    Влияет ли на размер размер фрагмента изображения, который я пытаюсь загрузить? Каждое изображение имеет размер 1024x256 и имеется 10 таких изображений.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню