我在使 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=width;h=height;
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]);
变量:
// data types:
unsigned long int *tex[20];
int mipmaps, width, height, w, h;
GLuint texname;
tex
是一个保存纹理 mipmap 像素数组列表的数组。 mipmap 处理正确(我单独测试了它们)。mipmaps
是将原始图像缩小为 1x1 像素纹理的 mipmap 数量(原始纹理为 256x256 - 所以此时在代码中为 8)。width
and height
是原始纹理的尺寸 (256x256)。
结果是它甚至不使用纹理。一切都显得平坦的灰色(由于照明而呈灰色)。
有什么我忘记了吗?我查过这个参考 http://www.glprogramming.com/red/chapter09.html,我找不到任何冲突。
其他细节:总的来说,我启用了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),如果这可能与之有关的话。
EDIT:
问题是,当我将 GL_NEAREST_MIPMAP_NEAREST 更改为 GL_NEAREST 时,纹理工作正常(不使用 mipmap)。所以,我看不出它怎么可能是任何其他代码——至少我想不出它可能是什么。