OpenGL纹理内存布局和查找速度

Posted

技术标签:

【中文标题】OpenGL纹理内存布局和查找速度【英文标题】:OpenGL texture memory layout and lookup speed 【发布时间】:2017-04-25 06:40:25 【问题描述】:

众所周知,OpenGL 和许多图像/视频格式的像素数据来源不同。因此,当我们使用 OpenGL 绘制图像(尤其是来自相机的实时图像)时,我们有以下选项。

    翻转图像(在 CPU 上)然后上传到 GPU,正常绘制。 直接上传到 GPU 并使用翻转的纹理坐标进行绘制

现在,我不想翻转图像,因为它不是免费的(处理成本),如果我们继续在 CPU 上使用图像,我们可能需要执行以下操作之一:

分配新的图像缓冲区 -> 翻转到这个新缓冲区 -> 上传到 GPU -> 释放新缓冲区 原地翻转图像 -> 上传到 GPU -> 再次原地翻转

两者都使用额外的内存和处理能力。 (我知道第一种情况下的新缓冲区可以分配一次。它仍然会消耗内存并且翻转是在 CPU 上完成的。)

所以我知道我们应该使用上面的方法(2),并且要非常小心地正确翻转纹理坐标。我一直听说这是一种更快的方法,然而,当我们给出翻转的纹理坐标时,GPU 访问纹理的速度没有人知道。如今,许多计算机(笔记本电脑)都集成了使用系统内存的 GPU。我们给纹理坐标的方式不会影响纹理查找速度吗?

总而言之,我的问题归结为:纹理查找和过滤速度会根据 GPU 内存中纹理的实际布局而改变吗?我想知道这对于像 nvidia 这样的专用 GPU 和像 intel 这样的集成 GPU。

PS:这纯粹是出于教育目的,我意识到知道这个问题的答案对应用程序性能没有太大影响,但拥有一些内在知识总是好的。我也很好奇:)

【问题讨论】:

首先,在使用OpenGL时不要对这些东西做任何假设。我看不出有什么理由不在这里应用常识(例如,尝试对缓存友好,尽量减少带宽使用),但我永远不会说特定的 GLSL 将在所有支持硬件上执行完全相同。其次,您没有提供几乎足够的信息来说明您的应用程序对性能的重要性以及您正在对纹理进行哪些类型的处理。如果您无法推理复杂性,为什么还要从假定翻转 tex 坐标的影响开始? 这不完全是关于我的应用程序。 (2)无论如何在所有情况下都更快,我不想让它更快。这更多是出于教育目的。我正在编辑问题以说明这一点,谢谢。 【参考方案1】:

TL/DR 的答案是:不,不会有任何明显的速度变化。

GPU,无论其来源如何(NV、AMD、英特尔——无论制造商是谁),都是这样设计的。 Texture maps 在现代 3D 图形中无处不在,所以如果 GPU 不能处理仿射纹理转换,那么它就是一个糟糕且无法销售的 GPU。

【讨论】:

常识也告诉我,很高兴听到它很常见:)

以上是关于OpenGL纹理内存布局和查找速度的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES 压缩纹理

什么是纹理内存,由 OpenGL 分配,受限制?

Rust 中的精确内存布局控制?

OpenGL 纹理映射内存泄漏

android:布局绘制内存泄露响应速度listview和bitmap线程优化以及一些优化的建议!

确保释放 OpenGL 纹理内存