【问题标题】:Performance boost due to mipmapping由于 mipmapping 的性能提升
【发布时间】:2013-12-25 06:00:18
【问题描述】:

为什么 mipmap 可以提高性能? 我在网上某处读到“当我们有 256 x 256 纹理数据并想要将其映射到 4x4 时,驱动程序只会将生成的 4x4 mipmap 级别复制到 GPU 内存而不是 256x 256 数据。采样将适用于复制的 4x4 数据在 GPU 内存上,这将节省大量计算”我只想知道它是否正确?

此外,当 glTeximage 调用发生时,它会将纹理数据上传到 gpu 内存中,这些数据在 glteximage 调用中传递。然后它与上面的说法相冲突。当我们调用 glgeneratemipmap() 时,它是否会在 CPU 端创建所有 mipmap 级别,然后在 GPU 端复制所有这些级别?

【问题讨论】:

    标签: opengl mipmaps


    【解决方案1】:

    Mipmapping 提高性能的主要原因有两个。第一个是因为它减少了 GPU 内存和纹理单元之间的带宽,第二个是因为它改进了纹理单元内部的缓存。

    假设您有一个应用了纹理的远处物体。使用 mipmaping GPU 而不是处理、读取和缓存一个巨大的纹理(级别 0),它会读取一个较小的纹理。在这种情况下,带宽减少是非常明显的。

    mipmaping 的带宽和缓存齐头并进。对距离对象的纹理进行采样很可能会以稀疏的方式读取纹理。例如读取 texel x,y 并为下一个片段读取 x+10,y+10。 x+10,y+10 可能在另一个高速缓存行中。当从较小的纹理中读取时,尽管缓存未命中可能要少得多。

    glTexImageXX 创建单个关卡并将像素数据上传到 GPU。调用 glGenerateMipmap 时,驱动程序将为其他级别分配 GPU 内存,并且很可能它会执行单个或多个 GPU 作业来填充这些级别。在某些情况下,它会在 CPU 上做同样的事情,然后将数据上传到 GPU。

    【讨论】:

    • 能否请您解释第二点,它如何改善纹理单元内的缓存?
    • @debonair:当你使用 mipmaps 时,样本大小更接近实际的纹素大小。所以获取更接近。我有一个 answer 完整的图表,可能有助于可视化正在发生的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多