TBO/VBO/other,用于带有压缩和mipmap的opengl纹理

TBO/VBO/other,用于带有压缩和mipmap的opengl纹理,opengl,textures,Opengl,Textures,到目前为止,我使用了: 纹理创建: 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,

到目前为止,我使用了:

纹理创建:

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协作的


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

这是你问题的根源

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

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

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

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

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

“像素缓冲对象”只不过是一种方法。复制完成后,缓冲区不再与纹理关联。除非动态修改纹理的内容,否则PBO与整体纹理性能关系不大

是一种将缓冲区对象用作纹理存储的方法。但缓冲纹理是一个重要的概念;它们与2D纹理的区别就像2D纹理与3D纹理的区别一样。缓冲区纹理不能进行mipmapped,不能有数组层,不能有过滤或任何采样参数,只能使用a(并且没有压缩),并且只能使用
texelFetch
及其类似工具访问。它们是一维(但不是一维纹理)

缓冲区纹理只是着色器直接从GPU内存的线性阵列读取的一种方式。不能简单地用缓冲区纹理替换2D纹理;你必须重新设计你的着色器和一切


总而言之,您似乎对OpenGL有很多误解。

PBO用于优化像素传输,您根本不应该将其用于存储目的。此外,没有TBO(无论如何,这不是为了您的目的),纹理是opengl对象,但不是缓冲区对象。另外,您当前的解决方案有什么问题,效率不够?我使用的是多个对象的大场景(每个对象至少有3个纹理)。我认为使用这些纹理有更快的解决方案。我读过关于PBO/TBO的文章,在大多数情况下会对性能产生影响。所以我想用这样的东西来加快我的引擎(也使用压缩和mipmap)没有,纹理对象是存储纹理的全部,有一些使用缓冲对象的高级方法,但这些通常不用于传统纹理。此外,图形性能在很大程度上取决于您的应用程序,而不仅仅是基于随机读取实现(当然,如果他们推荐PBO用于纹理存储:s)。首先确定瓶颈(例如测量瓶颈),然后开始优化。我认为通过使用缓冲区,驱动程序可以直接访问数据纹理,因此一切都会更快。改变纹理怎么样?(例如,如果所有对象都不适合内存?)纹理对象(形式,我在顶部给出)将继续是一个合理的解决方案,否则我应该享受缓冲区的乐趣?