我在让 mipmap 工作时遇到了很多麻烦。我使用的是 OpenGL 1.1,而且我没有 glu,所以我使用以下纹理初始化代码:
glGenTextures(1,&texname); glBindTexture(GL_TEXTURE_2D,texname); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_NEAREST); w=宽度;h=高度; for(int i=0;i<mipmaps;i++,w/=2,h/=2) glTexImage2D(GL_TEXTURE_2D,i,GL_RGBA8,w,h,0,GL_RGBA,GL_UNSIGNED_BYTE,tex[i]);
变量:
// 数据类型: 无符号长整数 *tex[20]; int mipmaps,宽度,高度,w,h; GLuint texname;
tex
是一个包含纹理 mipmap 像素数组列表的数组。mipmap 被正确处理(我单独测试了它们)。mipmaps
是将原始图像缩小为 1x1 像素纹理的 mipmap 的数量(原始纹理为 256x256 - 因此在代码中的这一点为 8)。是原始纹理的尺寸(256x256)width
。height
结果是它甚至不使用纹理。一切都只是呈现平坦的灰色(由于照明而呈灰色)。
有什么我忘记了吗?我检查了这个参考,我找不到任何冲突。
其他细节:总的来说,我启用了 GL_DEPTH_TEST、GL_TEXTURE_2D、GL_LIGHTING、GL_CULL_FACE、GL_FOG(和 GL_LIGHT0、GL_LIGHT1,它们可能没有什么区别)。另外,我正在使用 Mesa 3D 的 OpenGL 实现(Mesa 4.0 版,可转换为 OpenGL 1.3 版),如果这可能与它有关的话。
编辑:
问题是,当我将 GL_NEAREST_MIPMAP_NEAREST 更改为 GL_NEAREST 时,纹理工作正常(不使用 mipmap)。所以,我看不出它怎么可能是任何其他代码——至少我想不出它可能是什么。