我无法在我的多维数据集上通过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卡,所以问题出在其他地方。
答案 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。