【问题标题】:TBO/VBO/other for opengl textures with compression and mipmapsTBO/VBO/other 用于带有压缩和 mipmap 的 opengl 纹理
【发布时间】:2012-12-01 23:59:28
【问题描述】:

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

纹理创建:

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 配合使用?

【问题讨论】:

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

标签: opengl textures


【解决方案1】:

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

这是你问题的根源。

当你调用glTexImage2D 时,你是在告诉OpenGL 到allocate storage for the texture object。在此调用之后,纹理具有该图像数据的存储。这就像调用malloc,只是为了纹理内存。纹理不再尝试从您提供的内存指针中读取(不是在调用之后);您可以(并且通常应该)删除它。纹理现在具有该数据,在内部

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

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

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

最重要的是,PBO 和 TBO 并非如此。

“像素缓冲区对象”不过是asynchronously copy pixel data into or out of a texture's storage 的一种方式。复制完成后,缓冲区与纹理不再没有关联。除非您动态修改纹理的内容,否则 PBO 与整体纹理性能几乎没有关系。

Buffer textures 是一种使用缓冲区对象作为纹理存储的方法。但是缓冲区纹理是different texture type;它们不同于 2D 纹理,就像 2D 纹理不同于 3D 纹理一样。缓冲区纹理不能被 mipmap,不能有数组层,不能有过滤或任何采样参数,只能使用very limited set of image formats(并且它们都没有被压缩),它们只能可以使用texelFetch 及其同类访问。它们是一维的(但不是一维纹理)。

缓冲区纹理只不过是着色器直接从 GPU 内存的线性数组中读取的一种方式。您不能简单地用缓冲纹理替换 2D 纹理;你必须重新设计你的着色器和所有东西。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多