据我所知,自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。
答案 0 :(得分:3)
您可能需要设置像素存储参数。最重要的是行对齐。尝试添加
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
在致电glTexImage3D
之前。