2010-12-11 45 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吗? – 2010-12-11 06:39:13

回答

3

你给了一个非零值到边界参数,但分配给该缓冲区不占,所以glTexImage3D做一个缓冲区中读取溢出。

d是不是两个权力,所以你有另一个问题。你可以使用带有空指针的glTexImage3D来初始化纹理,使用glTexSubImage3D来填充实际内容 - 传递给glTexSubImage的数据也可以是2格式的非幂(但纹理本身必须用2维...以及边界)。

+0

哦,所以将0传递给TexImage的数据参数是合法的?那很棒!当我需要FBO的“空白”纹理时,我总是创建一个空数据的临时向量:D – Kos 2010-12-11 17:57:40

+0

是的,完全合法。它在所有正式文件中都写得很清楚。 – datenwolf 2010-12-12 00:25:46