NPOT纹理分配失败,具有精确的相应数据

时间:2012-10-15 08:40:48

标签: opengl textures

据我所知,自3.0以来,OpenGL一直高度支持NPOT纹理。现在我面临一个奇怪的现象,即NPOT纹理不能用精确的相应数据分配。言语很简单。我的测试代码如下。

glGenTextures(1, &texVoxels);
glBindTexture(GL_TEXTURE_3D, texVoxels);
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_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);

int width = 513;
int height = 513;
int depth = 513;
unsigned char *data = new unsigned char[width*height*depth];
memset(data, 0, sizeof(unsigned char)*width*height*depth);

glTexImage3D(GL_TEXTURE_3D, 0, GL_LUMINANCE8, width, height,depth, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);

delete []data;
data = NULL;

如上所示,我需要分配2 ^ N +1的NPOT立方纹理。但程序将退出 glTexImage3D()上的错误。我认为,错误是由“数据的大小小于所需的纹理”引起的。因为如果我分配数据足够大,程序将通过。

我如何使用NPOT纹理并分配这样的数据?即使数据的大小足够大,程序通过,我真的不确定数据如何与纹理位置完全对应。

PS。我的显卡是quadro fx 4800,支持OpenGL 3.3。

1 个答案:

答案 0 :(得分:3)

您可能需要设置像素存储参数。最重要的是行对齐。尝试添加

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

在致电glTexImage3D之前。