gpt4 book ai didi

c++ - 纹理未通过 glGenerateMipmap() 加载

转载 作者:行者123 更新时间:2023-11-28 03:10:05 29 4
gpt4 key购买 nike

我无法在我的立方体上通过 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,这是非常糟糕的结果(没有绑定(bind)纹理我得到大约 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 卡所以问题出在其他地方。

最佳答案

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

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

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

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

关于c++ - 纹理未通过 glGenerateMipmap() 加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18712729/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com