Mipmaps + PBO:奇怪的问题

时间:2010-09-22 08:35:35

标签: opengl graphics

我正在使用PBO在我的应用程序中更快地加载纹理。如果我使用opengl 3或更好的视频卡,我可以通过调用glGenerateMipmap轻松构建mipmap,它工作正常。 但是在我的旧版opengl 2.1卡(radeon x800)上,该功能不可用,所以我必须使用以下两种传统方法之一:

glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w,h, 0,GL_RGBA,GL_UNSIGNED_BYTE, src); 

gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA8, w,h, GL_RGBA,GL_UNSIGNED_BYTE, src);

第一种方法即使在PBO上也不能正常工作,它会引入奇怪的工件。第二个,在PBO上构建正确的mipmap,并且PBO会生成段错误。 任何人都可以帮忙??

为了完整性,我附上了我用于PBO的代码:

uint pixelBuffer;
glGenBuffers(1, &pixelBuffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pixelBuffer);
glBufferData(GL_PIXEL_UNPACK_BUFFER, size*4, NULL, GL_STATIC_READ);
char *pixels = (char*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER, GL_WRITE_ONLY);
... transfer data
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
... and then I use the buffer to create the texture

PS如果我不尝试生成mipmap,则pbo加载适用于我的所有视频卡。

1 个答案:

答案 0 :(得分:1)

这很简单,gluBuild2DMipmaps()期望客户端内存中的指针(因为它只是一个glu函数,而不是驱动程序的一部分)所以它不适用于PBO。至于使用

glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);

尝试在 glTexImage2D()之后调用。有些驱动程序以不同的方式实现此扩展,实际上每次生成mipmap时都需要调用此行(没有完成“自动 aly”)。你的奇怪工件实际上是较高mipmap级别的随机数据,因为根本没有生成mipmap。

至于使用PBO来提高速度,这是完全合法的方法。 “固定内存”可能有一种新的方式,但我还没有考虑过它。