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(…)
做了几件事:
- OpenGL纹理中的默认LOD级别范围:1001(最小值=0,最大值=1000)
- 在
之后:log2(max(Resx,Resy))+1(min=0,max=…)gluBuild2DMipmaps(…)
需要注意的其他事项: 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,停止使用不推荐的功能…尝试引用。