2

到目前为止,我已经使用过:

纹理创建:

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
glTexImage2D(GL_TEXTURE_2D, 0,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT  , tWidth,Height, 0, GL_RGBA, GL_UNSIGNED_BYTE,Data);
glGenerateMipmap(GL_TEXTURE_2D);

纹理用法:

glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);

我正在寻找有效的解决方案来将纹理保存在内存中并在着色器中使用它。我已经阅读了一些关于 PBO 和 TBO(以及其他一些解决方案)的内容,但是我无法通过压缩和 mipmap 的示例找到它们。你建议我选择什么?哪个更快?以及它如何与压缩和 mipmap 配合使用?

4

1 回答 1

3

我认为通过使用缓冲区,驱动程序可以直接访问数据纹理,所以一切都会更快。

这是你问题的根源。

当您调用时glTexImage2D,您是在告诉 OpenGL为纹理对象分配存储空间。在此调用之后,纹理将存储该图像数据。这就像调用malloc,仅用于纹理内存。纹理不再尝试从您提供的内存指针中读取(不是在调用之后);您可以(并且通常应该)删除它。纹理现在在内部具有该数据。

那么改变纹理呢?(例如,如果所有内容都不适合内存?)

分配更多内存(您正在谈论的缓冲区对象)不会使其更有可能适合内存。如果你内存不足,你就内存不足;做更多的分配是没有帮助的。

更重要的是,缓冲区对象与纹理存在相同的内存问题。如果驱动程序喜欢它,它会将它们从 GPU 内存中删除。所以你什么也得不到。所以缓冲区对象存储与纹理对象存储没有区别。

最重要的是,PBO 和 TBO 不是那样工作的。

“像素缓冲区对象”只不过是一种将像素数据异步复制纹理存储中或从中复制出来的方法。复制完成后,缓冲区与纹理不再关联。除非您动态修改纹理的内容,否则 PBO 与整体纹理性能几乎没有关系。

Buffer textures are a way to use a buffer object as the storage for a texture. But buffer textures are a different texture type; they are as different from 2D textures as 2D textures are different from 3D textures. Buffer textures can't be mipmapped, cannot have array layers, cannot have filtering or any sampling parameters at all, can only use a very limited set of image formats (and none of them are compressed), and they can only be accessed with texelFetch and its ilk. They are one-dimensional (but not 1D textures).

Buffer textures are little more than a way for a shader to just directly read from a linear array of GPU memory. You cannot simply replace a 2D texture with a buffer texture; you'd have to redesign your shaders and everything.

All in all, you seem to be misunderstanding a lot about OpenGL.

于 2012-12-01T15:59:28.657 回答