纹理没有通过glGenerateMipmap()加载

时间:2013-09-10 07:15:39

标签: c++ winapi opengl textures

我无法在我的多维数据集上通过glGenerateMipmap加载纹理。

我从resource.h文件加载BMP纹理。

我的加载函数在WM_CREATE上调用,如下所示:

void LoadTEX()
{
 GLuint texture;  
 HBITMAP GLtex;
 BITMAP tex;
 byte Texture=TEX;
 GLtex= (HBITMAP)LoadImage(GetModuleHandle(NULL),MAKEINTRESOURCE(Texture), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);

  GetObject(GLtex,sizeof(tex), &tex);
  glPixelStorei(GL_UNPACK_ALIGNMENT,sizeof(Texture));
  glEnable(GL_TEXTURE_2D);
  glGenTextures(sizeof(Texture), &texture);
  glBindTexture( GL_TEXTURE_2D, texture );
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );  
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  glTexImage2D( GL_TEXTURE_2D,
            0,
            GL_RGB,
            tex.bmWidth,
            tex.bmHeight,
            0,
            GL_RGB,GL_UNSIGNED_BYTE,
            tex.bmBits);

 glDeleteTextures(sizeof(Texture), &texture);
}

WM_PAINT

 glColor3f(1.0f,1.0f,1.0f);
 glEnable(GL_TEXTURE_2D);
 glBindTexture( GL_TEXTURE_2D, texture );
 // glActiveTexture(GL_TEXTURE0);
 // glGenerateMipmap(GL_TEXTURE_2D);
 gluBuild2DMipmaps(GL_TEXTURE_2D, 3, tex.bmWidth, tex.bmHeight, GL_RGB, GL_UNSIGNED_BYTE, tex.bmBits);

上面的代码工作正常(纹理到位),但问题是它给了我40 FPS,这是非常糟糕的结果(没有纹理粘合我得到大约300 FPS)。

其次是我不想使用gluBuild2DMipmaps因为它有点旧,而是我想使用glGenerateMipmap。问题是,如果我发表评论gluBuild2DMipmaps并取消注释glActiveTexture(GL_TEXTURE0);,则glGenerateMipmap(GL_TEXTURE_2D)不会显示任何内容。

我的PIXELFORMATDESCRIPTOR看起来像是:

PIXELFORMATDESCRIPTOR pfd;
int format;

// get the device context (DC)
*hdc = GetDC( hwnd );

// set the pixel format for the DC
ZeroMemory( &pfd, sizeof( pfd ) );
pfd.nSize = sizeof( pfd );
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 32;
pfd.cDepthBits = 32;
pfd.iLayerType = PFD_MAIN_PLANE;
format = ChoosePixelFormat( *hdc, &pfd );
SetPixelFormat( *hdc, format, &pfd );

所有这些都在ATI和OPENGL 3.1支持上运行。我打电话给glEnable(GL_TEXTURE_2D);所以这应该适用于ati卡,所以问题出在其他地方。

2 个答案:

答案 0 :(得分:2)

在LoadTEX中,加载后不要直接删除纹理。 (也应该是glGenTextures(1,& texture)和glDeleteTextures(1,& texture)来生成和删除一个纹理句柄)

然后用glTexImage2D加载后调用glGenerateMipmap。除非纹理发生变化,否则你需要每帧重新生成mipmap,在这种情况下,请将调用保留在原来的位置。

无论如何,

glActiveTexture(GL_TEXTURE0)是默认值。如果你同时绑定其他纹理,你可以使用glActiveTexture(GL_TEXTURE1)或glActiveTexture(GL_TEXTURE0 + textureIndex)等。

我不确定windows位图加载的细节,但仔细检查glPixelStorei线,给定其他sizeof(纹理)使用我必须假设这也可能是不正确的。为安全起见,只需将其设置为1个字节。

答案 1 :(得分:0)

我在加载纹理时使用以下顺序:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, n2width, n2height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixmap);

glHint(GL_GENERATE_MIPMAP_HINT, GL_FASTEST);//GL_FASTEST);
glGenerateMipmap(GL_TEXTURE_2D); // Generate mip mapping

并且不要在每一帧重建mipmap。