glTexImage2D与gluBuild2DMipmaps 非常基本的OpenGL纹理创建代码: int宽度、高度; 字节*数据; 文件*文件; //打开纹理数据 file=fopen(文件名为“rb”); 如果(file==NULL)返回0; //分配缓冲区 宽度=256; 高度=256; 数据=(字节*)malloc(宽*高*3); //读取纹理数据 fread(数据,宽度*高度*3,1,文件); fclose(文件); glGenTextures(1,&纹理); glBindTexture(GL_TEXTURE_2D,纹理); //gluBuild2DMipmaps(GL_纹理_2D,3,宽度,高度,GL_RGB,GL_无符号字节,数据); GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_无符号字节,数据); 免费(数据); 返回纹理; 和渲染: glEnable(GL_纹理_2D); glBindTexture(GL_TEXTURE_2D,纹理); glPushMatrix(); glRotatef(θ,0.0f,0.0f,1.0f); glBegin(GL_QUADS); glTexCoord2d(0.0,0.0);glVertex2d(-1.0,-1.0); glTexCoord2d(1.0,0.0);glVertex2d(+1.0,-1.0); glTexCoord2d(1.0,1.0);glVertex2d(+1.0,+1.0); glTexCoord2d(0.0,1.0);glVertex2d(-1.0,+1.0); 格伦德(); glPopMatrix(); SwapBuffers(hDC);

glTexImage2D与gluBuild2DMipmaps 非常基本的OpenGL纹理创建代码: int宽度、高度; 字节*数据; 文件*文件; //打开纹理数据 file=fopen(文件名为“rb”); 如果(file==NULL)返回0; //分配缓冲区 宽度=256; 高度=256; 数据=(字节*)malloc(宽*高*3); //读取纹理数据 fread(数据,宽度*高度*3,1,文件); fclose(文件); glGenTextures(1,&纹理); glBindTexture(GL_TEXTURE_2D,纹理); //gluBuild2DMipmaps(GL_纹理_2D,3,宽度,高度,GL_RGB,GL_无符号字节,数据); GLTEXAGE2D(GL_纹理_2D,0,GL_RGB,宽度,高度,0,GL_RGB,GL_无符号字节,数据); 免费(数据); 返回纹理; 和渲染: glEnable(GL_纹理_2D); glBindTexture(GL_TEXTURE_2D,纹理); glPushMatrix(); glRotatef(θ,0.0f,0.0f,1.0f); glBegin(GL_QUADS); glTexCoord2d(0.0,0.0);glVertex2d(-1.0,-1.0); glTexCoord2d(1.0,0.0);glVertex2d(+1.0,-1.0); glTexCoord2d(1.0,1.0);glVertex2d(+1.0,+1.0); glTexCoord2d(0.0,1.0);glVertex2d(-1.0,+1.0); 格伦德(); glPopMatrix(); SwapBuffers(hDC);,opengl,glu,mipmaps,texturing,glteximage2d,Opengl,Glu,Mipmaps,Texturing,Glteximage2d,使用glTexImage2D,除了使用gluBuild2DMipmaps工作外,什么也不绘制。我看到了使用gDebugger正确创建纹理的结果。有什么问题 在代码中使用glTexImage2D(…)时,不会构建mipmap完整纹理。它仅为纹理LOD 0创建存储并提供数据。如果您使用GL_…\u MIPMAP_…作为缩小过滤器,则需要为每个季度分辨率步骤设置LOD(详细等级) 例如,尺寸32x32的纹理需要log2 32=5额外的mipmap LOD,如下所述: LOD 0:32x32(1/1)[

使用
glTexImage2D
,除了使用
gluBuild2DMipmaps
工作外,什么也不绘制。我看到了使用gDebugger正确创建纹理的结果。有什么问题

在代码中使用
glTexImage2D(…)
时,不会构建mipmap完整纹理。它仅为纹理LOD 0创建存储并提供数据。如果您使用
GL_…\u MIPMAP_…
作为缩小过滤器,则需要为每个季度分辨率步骤设置LOD(详细等级)

例如,尺寸32x32的纹理需要log2 32=5额外的mipmap LOD,如下所述:

LOD 0:32x32(1/1)[1024 texel]
LOD 1:16x16(1/4)[256 texel]
LOD 2:8x8(1/16)[64 texel]
LOD 3:4x4(1/64)[16 texel]
LOD 4:2x2(1/256)[4 texel]
LOD 5:1x1(1/1024)[1 Texel]
gluBuild2DMipmaps(…)
做了几件事:
  • 它构建四分之一分辨率mipmap LOD集(因此得名)
  • 它可以正确设置纹理中的LOD数量

    • OpenGL纹理中的默认LOD级别范围:1001(最小值=0,最大值=1000)
    • gluBuild2DMipmaps(…)
      之后:log2(max(Resx,Resy))+1(min=0,max=…)
  • 这将生成mipmap完整纹理,可与mipmap缩小过滤器一起使用


    需要注意的其他事项: OpenGL中的默认缩小过滤器是:
    GL\u最近的MIPMAP\u线性
    ,因此需要MIPMAP完整纹理,除非将其更改为
    GL\u线性
    GL\u最近的

    OpenGL中的LOD索引工作起来有点反直觉。较低的数字表示分辨率较高的图像,这就是为什么使用负LOD偏差有时被称为“纹理锐化”


    几何级数:1+1/4+1/16+1/64+…+1/N收敛到4/3;mipmap需要~33%额外的存储空间。

    所有这些不推荐使用的代码都会伤害我的眼睛。。。解决方案1,停止使用不推荐的功能…尝试引用。