2010-12-11 24 views
3

La suite fait partie du code. Il n'y a pas de problème lors de la compilation, mais il se bloque lorsqu'il est exécuté. Et ça casse dans la ligne de glTexImage3D. Qt version 4.5.3, et la classe "opengl" est héritée de QGLWidget.glTexImage3D se bloque dans 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

Avez-vous vérifié si glTexImage3D! = NULL? –

Répondre

3

Vous avez donné une valeur non nulle au paramètre frontière, mais le tampon alloué pour cela ne tient pas compte, donc glTexImage3D fait un dépassement de mémoire tampon de lecture.

Egalement d n'est pas une puissance de deux donc il y a un autre problème. Vous pouvez utiliser glTexImage3D avec un pointeur nul pour les données pour initialiser la texture et glTexSubImage3D pour le remplir avec le contenu réel - les données passées à glTexSubImage peuvent aussi être en format 2 de non puissance (mais la texture elle-même doit être initialisée avec la puissance de 2 dimensions ... et les frontières aussi, aussi).

+0

Oh, donc il est légal de passer 0 au paramètre data de TexImage? C'est génial! J'ai toujours créé un vecteur temporaire de données vides quand j'avais besoin d'une texture "vide" pour un FBO: D – Kos

+0

Oui, parfaitement légal. C'est écrit clairement dans toute la documentation officielle. – datenwolf