OpenGL中的Mipmapping

3
我在使用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]);

变量:

// 数据类型:
unsigned long int *tex[20];
int mipmaps, width, height, w, h;
GLuint texname;

tex是一个数组,保存纹理mipmap像素数组的列表。mipmaps已经正确处理(我单独测试过它们)。mipmaps是减少原始图像为1x1像素纹理的mipmaps数量(原始纹理为256x256 - 因此在代码中此时为8)。widthheight是原始纹理的尺寸(256x256)。

结果是它甚至没有使用纹理。一切都是灰色的(由于光照而变成灰色)。

我有什么遗漏的吗?我已经检查过这个参考,但找不到任何冲突。

其他细节:总的来说,我启用了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)。所以,我看不出这可能是其他任何代码 - 至少我想不到还有其他原因。


不,我查过了,我认为它是在3.0版本中添加的。 - Codesmith
呵呵,不是这样的!这就是为什么它很奇怪。实际上,为了使其工作,我只需将GL_NEAREST_MIPMAP_NEAREST更改为GL_NEAREST,突然间它就可以工作了,但不使用mipmaps。 - Codesmith
Mipmaps的价值和tex的数据类型是什么? - derpface
在文件的这一点上,当作为void*数据查看时,字节和无符号长整型之间没有任何差别。此外,在我不处理mipmap时它确实有效。(附言:我们应该将其移动到聊天中吗?) - Codesmith
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/28136/discussion-between-uberwulu-and-auto - derpface
显示剩余3条评论
1个回答

6

纹理金字塔的级别是8。你的图片大小为256x256。因此,你应该有9个级别的纹理金字塔(256、128、64、32、16、8、4、2、1)。如果缺少其中一个级别,你将失去你的纹理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接