2010-12-11 7 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は2の威力ではありませんので別の問題があります。 glTexImage3Dは、データのヌルポインタを使用してテクスチャを初期化し、glTexSubImage3Dを実際のコンテンツで埋め込むことができます。glTexSubImageに渡されるデータは、2の倍数でない場合もあります(テクスチャ自体は、 2次元...そして境界も)。

+0

ああ、TexImageのデータパラメータに0を渡すのは合法ですか?それは素晴らしいことです!私はFBOの「空の」テクスチャが必要なときに、空のデータの一時的なベクトルを作成しました。D – Kos

+0

はい、完全に合法です。すべての公式文書に明白に書かれています。 – datenwolf

関連する問題