2010-12-11 46 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