2010-12-11 4 views
3

Ниже приведена часть кода. При компиляции проблем не возникает, но при их выполнении происходит сбой. И он ломается в строке glTexImage3D. Qt версии 4.5.3, а класс «opengl» наследуется от QGLWidget.сбой glTexImage3D в QT

void opengl::initializeGL() 
{ 
    GLenum err = glewInit(); 
    create_volumetexture(); 
} 

void opengl::create_volumetexture() 
{ 
    int w = 256, h = 256, d = 225; 
    size_t size = w * h * d; 

    if (dataRGBA) 
    { 
     delete dataRGBA; 
     dataRGBA=NULL; 
    } 
    dataRGBA=new GLubyte[4*size]; 
    for (int i=0; i<size; i++) 
    { 
     dataRGBA[4*i]=200; 
     dataRGBA[4*i+1]=0; 
     dataRGBA[4*i+2]=0; 
     dataRGBA[4*i+3]=100; 
    } 

    glGenTextures(1, &volume_texture); 
    // bind 3D texture target 
    glBindTexture(GL_TEXTURE_3D, volume_texture); 
    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    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); 

    glPixelStorei(GL_UNPACK_ALIGNMENT,1); 
    glTexImage3D(GL_TEXTURE_3D_EXT, 0, GL_RGBA, w, h, d, 1, /*GL_LUMINANCE*/GL_RGBA, GL_UNSIGNED_BYTE,dataRGBA); 

} 
+1

Проверено ли, если glTexImage3D! = NULL? –

ответ

3

Вы дали ненулевое значение параметра границы, но буфер выделяется, что не учитывает это, так glTexImage3D делает буфер чтение перерасхода.

Также d не является силой двух, поэтому у вас есть еще одна проблема. Вы можете использовать glTexImage3D с нулевым указателем для данных для инициализации текстуры и glTexSubImage3D, чтобы заполнить его фактическим содержимым - данные, переданные в glTexSubImage, также могут быть не в силе 2-го формата (но сама текстура должна быть инициализирована с мощностью 2 измерения ... и границы тоже).

+0

О, так законно передавать 0 в параметр данных TexImage? Замечательно! Я всегда создавал временный вектор пустых данных, когда мне нужна была «пустая» текстура для FBO: D – Kos

+0

Да, совершенно законно. Он полностью написан во всей официальной документации. – datenwolf

Смежные вопросы