我正在使用PBO在我的应用程序中更快地加载纹理。如果我使用OpenGL3或更好的视频卡,那么我可以通过调用glGenerateMipmap轻松地构建mipmap,它工作得很好。但在我的旧OpenGL2.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 texturePS如果我不尝试生成mipmap,pbo加载将在我所有的视频卡上工作。
发布于 2012-02-13 19:33:42
这很简单,gluBuild2DMipmaps()需要客户端内存中的指针(因为它只是一个glu函数,而不是驱动程序的一部分),所以它不能与PBO一起工作。至于使用
glTexParameteri(GL_TEXTURE_2D,GL_GENERATE_MIPMAP,GL_TRUE);
尝试在glTexImage2D()之后调用它。一些驱动程序以不同的方式实现此扩展,并且实际上需要在每次应该生成mipmap时调用此行(there's nothing done "automatic aly")。奇怪的工件实际上是更高mipmap级别的随机数据,因为mipmap根本不是生成的。
至于使用PBO提高速度,这是完全合法的方法。也许有一种新的方法可以使用“钉住的记忆”,但我还没有研究过。
https://stackoverflow.com/questions/3767564
复制相似问题