glTexImage3D 在 QT 中崩溃
Posted
技术标签:
【中文标题】glTexImage3D 在 QT 中崩溃【英文标题】:glTexImage3D crashes in QT 【发布时间】:2010-12-11 05:42:00 【问题描述】:以下是部分代码。编译的时候没有问题,但是执行的时候就崩溃了。它打破了 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);
【问题讨论】:
你检查过 glTexImage3D != NULL 吗? 【参考方案1】:您为边框参数提供了一个非零值,但为其分配的缓冲区没有考虑到它,因此 glTexImage3D 执行缓冲区读取溢出。
另外,d 不是 2 的幂,所以你遇到了另一个问题。您可以使用带有空指针的 glTexImage3D 数据来初始化纹理,并使用 glTexSubImage3D 来填充实际内容——传递给 glTexSubImage 的数据也可能是非 2 的幂格式(但纹理本身必须使用 2 的幂进行初始化) 2 维……然后也是边界)。
【讨论】:
哦,那么给TexImage的data参数传0合法吗?那太棒了!当我需要 FBO 的“空”纹理时,我总是创建一个空数据的临时向量:D 是的,完全合法。它在所有官方文档中都写得很清楚。以上是关于glTexImage3D 在 QT 中崩溃的主要内容,如果未能解决你的问题,请参考以下文章