0

我无法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 卡,所以问题出在其他地方。

4

2 回答 2

2

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

然后在使用 glTexImage2D 加载后调用 glGenerateMipmap。除非纹理发生变化并且您需要在每一帧重新生成 mipmap,在这种情况下将调用留在原处。

glActiveTexture(GL_TEXTURE0) 无论如何都是默认的。如果您同时绑定其他纹理,您将使用 glActiveTexture(GL_TEXTURE1) 或 glActiveTexture(GL_TEXTURE0 + textureIndex) 等。

我不确定 Windows 位图加载的细节,但仔细检查 glPixelStorei 行,考虑到其他 sizeof(Texture) 用途,我不得不假设这也可能是不正确的。为了安全起见,只需将其设置为 1 个字节。

于 2013-09-10T07:33:19.633 回答
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。

于 2013-09-10T09:04:12.970 回答