在QT中,glTexImage3D崩溃了

3

以下是代码的一部分。编译时没有问题,但执行时会崩溃。并且它在glTexImage3D这一行中出错。Qt版本为4.5.3,类“opengl”继承自QGLWidget。

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 了吗? - Dr. Snoopy
1个回答

3
您给border参数传递了一个非零值,但为此分配的缓冲区没有考虑到它,因此glTexImage3D会进行缓冲区读取越界。
此外,d不是2的幂,所以您还有另一个问题。您可以使用具有空指针数据的glTexImage3D来初始化纹理,并使用glTexSubImage3D来填充实际内容 - 传递给glTexSubImage的数据也可以是非2次幂格式(但纹理本身必须用2次幂维度初始化...然后还要考虑边框)。

哦,那么将0传递给TexImage的数据参数是合法的吗?太好了!每当我需要一个“空”纹理用于FBO时,我总是创建一个临时的空数据向量:D - Kos
是的,完全合法。所有官方文档都明确写明了这一点。 - datenwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接