关于OPENGL中的MIPMAP

来源:互联网 发布:伪基站 知乎 编辑:程序博客网 时间:2024/05/01 15:38

当MIPMAP纹理都是自己创建的时候,设置的步骤如下

假设mipmap都存储在pic数组中


  1. glGenTextures(1, &texid);  
  2.   
  3.    glBindTexture(GL_TEXTURE_2D, texid);  
  4.   
  5.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);  
  6.   
  7.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);  
  8.   
  9.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);  
  10.   
  11.    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,   
  12.   
  13.                    GL_NEAREST_MIPMAP_NEAREST);  
  14.   
  15.    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0,  
  16.   
  17.                 GL_RGBA, GL_UNSIGNED_BYTE, pic[0]);  
  18.   
  19.    glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 16, 16, 0,  
  20.   
  21.                 GL_RGBA, GL_UNSIGNED_BYTE, pic[1]);  
  22.   
  23.    glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 8, 8, 0,  
  24.   
  25.                 GL_RGBA, GL_UNSIGNED_BYTE, pic[2]);  
  26.   
  27.    glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 0,  
  28.   
  29.                 GL_RGBA, GL_UNSIGNED_BYTE, pic[3]);  
  30.   
  31.    glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA, 2, 2, 0,  
  32.   
  33.                 GL_RGBA, GL_UNSIGNED_BYTE, pic[4]);  
  34.   
  35.    glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA, 1, 1, 0,  
  36.   
  37.                 GL_RGBA, GL_UNSIGNED_BYTE, pic[5]);  
  38.   
  39.   glBindTexture(GL_TEXTURE_2D, 0);
  40.   

这里的情况是mipmap的level一直到最小的 1 x 1

但是如果我们不想要这么高的level,比如只到4 x 4为止,那么还需要在 glTexImage2D 前面加上一句:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);

32 x 32 的纹理 level 为0, 那么 到 4 x 4为止的话, MAX_LEVEL 就应该设置为3, 注意这里如果MAX_LEVEL的设置大于实际提供的texture level,渲染结果也是会出错的。




当MIPMAP让OPENGL自动创建的时候



  • glGenTextures(1, &texid);  
  •   
  •    glBindTexture(GL_TEXTURE_2D, texid);  
  •   
  •    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);  
  •   
  •   // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 3);  // 同上
  • gluBuild2DMipmaps(GL_TEXTURE)2D, GL_RGBA, 32, 32, GL_RGBA, GL_UNSIGNED_BYTE, pic[0]);
  •   glBindTexture(GL_TEXTURE_2D, 0);
  •   

  • glGenTextures(1, &texid);  
  •   
  •    glBindTexture(GL_TEXTURE_2D, texid);  
  •   
  •    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);  
  •   
  •    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 32, 32, 0,  
  •   
  •                 GL_RGBA, GL_UNSIGNED_BYTE, pic[0]);  
  •   
  •    glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 16, 16, 0,  
  •   
  •                 GL_RGBA, GL_UNSIGNED_BYTE, pic[1]);  
  •   
  •    glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 8, 8, 0,  
  •   
  •                 GL_RGBA, GL_UNSIGNED_BYTE, pic[2]);  
  •   
  •    glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA, 4, 4, 0,  
  •   
  •                 GL_RGBA, GL_UNSIGNED_BYTE, pic[3]);  
  •   
  •    glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA, 2, 2, 0,  
  •   
  •                 GL_RGBA, GL_UNSIGNED_BYTE, pic[4]);  
  •   
  •    glTexImage2D(GL_TEXTURE_2D, 5, GL_RGBA, 1, 1, 0,  
  •   
  •                 GL_RGBA, GL_UNSIGNED_BYTE, pic[5]);  
  •   
  •   glBindTexture(GL_TEXTURE_2D, 0);
  •