【问题标题】:Rectangular and mipmap textures矩形和 mipmap 纹理
【发布时间】:2020-06-22 00:34:34
【问题描述】:

如果我们有支持 NPOT 纹理的 mipmap,那么矩形纹理有什么用?是否有任何与性能相关或与图像质量相关的改进? 另外,我认为,mipmapping 会占用大量内存,因为它为每个级别创建。那么,使用矩形纹理不是更好吗?

【问题讨论】:

  • 您不必对普通(非矩形)纹理使用 mipmap,这不是必须的。话虽如此,随着 NPOT 纹理(10 年来一直是核心)的出现,恕我直言,矩形纹理根本没有任何实际用途。

标签: opengl textures


【解决方案1】:

矩形纹理:

  1. 永远不要有 mipmap。
  2. 使用非标准化纹理坐标。

#1 并不那么重要,因为您可以通过使用glTexStorage2D 和setting the number of mipmap levels to 1,或通过setting the base/max level of the texture properly 和/或使用不使用mipmap 的min filtering parameters 来实现相同的效果。

#2 更难模仿。 texelFetch 函数在纹理空间中工作,但它使用整数纹理坐标。矩形纹理坐标是浮点值。这允许他们使用双线性甚至各向异性过滤。 texelFetch 无法做到这一点。

您可以通过规范化纹素空间纹理坐标来模拟矩形纹理。但这需要手动工作:您必须使用textureSize 查询纹理的大小,或者将uniform 中的大小传递给着色器。然后你必须做一个划分来标准化坐标。这可能是现代硬件在幕后所做的事情(特别是因为像 Vulkan 这样的新 API 没有它们),但如果明确支持矩形纹理,手动工作可能会绕过它。

#2 确实是您现在曾经使用矩形纹理的主要原因。它们非常适合渲染目标,因为您可以使用窗口空间坐标从它们中获取值,而无需标准化纹理坐标。但总的来说,它们是非常特殊的纹理类型。

性能问题纯粹是推测性的和特定于硬件的。

【讨论】:

  • +1 但最后 #2 只是普通纹理的额外乘法。
  • @ChristianRau:不仅如此;你必须得到纹理的大小。这需要使用textureSize(可能会占用统一资源)或直接使用统一(将占用统一资源)。这不是乘法;它是大小的 inverse 的乘积,相当昂贵。是的,矩形纹理可以由编译器为您完成所有这些实现。但是,如果它们有专用的硬件,那么这将为您提供更高的性能。如果是……你什么都没有丢失。
  • 好吧,好吧。那件制服可能不会伤害任何人,但实际上你得到了一个有效的观点。
  • @NicolBolas 你能详细说明你的第二点吗?这部分“但它们是浮点值”,浮点值究竟如何?
  • @Roshan:我不知道你想让我详细说明什么。浮点值是...浮点。您可以位于两个纹素之间,这是过滤所必需的。整数不能介于两者之间;他们准确地指定了一个纹素。
猜你喜欢
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2011-11-28
  • 2013-09-23
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多