glTexImage3D在QT中崩溃
问题描述:
以下是代码的一部分。编译时没有问题,但执行时会崩溃。它在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);
}
答
你给了一个非零值到边界参数,但分配给该缓冲区不占,所以glTexImage3D做一个缓冲区中读取溢出。
也d是不是两个权力,所以你有另一个问题。你可以使用带有空指针的glTexImage3D来初始化纹理,使用glTexSubImage3D来填充实际内容 - 传递给glTexSubImage的数据也可以是2格式的非幂(但纹理本身必须用2维...以及边界)。
你检查了glTexImage3D!= NULL吗? – 2010-12-11 06:39:13