3

我在让 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)widthheight

结果是它甚至不使用纹理。一切都只是呈现平坦的灰色(由于照明而呈灰色)。

有什么我忘记了吗?我检查了这个参考,我找不到任何冲突。

其他细节:总的来说,我启用了 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)。所以,我看不出它怎么可能是任何其他代码——至少我想不出它可能是什么。

4

1 回答 1

6

mipmaps 的值为 8。您的图像是 256x256。因此,您应该有 9 个级别的 mipmapping (256,128,64,32,16,8,4,2,1)。如果缺少一个,您将失去质感。

于 2013-04-13T01:53:33.003 回答