1

据我所知,OpenGL 从 3.0 开始就高度支持 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。

4

1 回答 1

3

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

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

打电话之前glTexImage3D

于 2012-10-15T09:33:07.857 回答