【问题标题】:Is it possible to use custom mipmap sizes?是否可以使用自定义 mipmap 大小?
【发布时间】:2011-04-23 19:07:05
【问题描述】:

我目前正在研究某种虚拟纹理实现。 mipmap 级别用作细节级别控制结构。 (虚拟纹理中的每个纹素都与“真实”纹理中的数据块相关。)

数据存在于多个细节级别,导致虚拟纹理中的块数不同。

例子:

level       size of data       number of blocks
0           60                 4
1           30                 2
2           15                 1

我的想法是为虚拟纹理中的每个细节级别调用 glTexImage 以创建不同的 mipmap 级别。

问题是尽管在创建或更新/加载时没有错误,但我无法从纹理中获取任何数据。仅创建基本级别并调用 glGenerateMipmap 可以正常工作,但会导致某些基本尺寸的尺寸错误。 (从技术上讲,它们是正确的,但在我的情况下不是)

我在某处读到 mipmap 级别大小必须是除以二(或除以二和地板)。

问题:

  • 是否可以加载“自定义”mipmap 级别?
  • 是否有任何限制 mipmap 级别大小?

【问题讨论】:

  • 我不确定我的观点是否清楚......但目前我找不到更好的词来描述我的问题。我希望你能理解我;)如果你需要更多信息,请询问。

标签: opengl mipmaps


【解决方案1】:

确保您已将 mipmap 级别一直加载到 1x1。见here

【讨论】:

  • 刚刚尝试过......但它仍然给了我空白屏幕。 glGenerateMipmaps 生成的 Mipmap 大小:(26, 32, 16), (13, 16, 8), (6, 8, 4), (3, 4, 2), (1, 2, 1), (1, 1 , 1) 我生成的 Mipmap 大小:(26, 32, 16), (13, 16, 8), (7, 8, 4), (4, 4, 2), (2, 2, 1), ( 1, 1, 1) 请注意在某些情况下我必须如何四舍五入。那是因为原始数据。
  • 原始数据集为:406,512,256;203,256,128;101,128,64;50,64,32;25,32,16;12,16,8;6,8,4;3,4, 2;1,2,1; 1,1,1 这些是正确的分界线和底线尺寸。但是除以块大小会导致一些随机舍入:/
【解决方案2】:

您可以加载自定义 mipmap 级别,但不能选择它们的大小。 OpenGL 为它期望的级别指定了 MipMap 的大小,并且不允许偏离它。

以宽度为例,mipmap leveli需要的宽度是max(1, floor(w_b / 2^i)),其中w_b是第一个mip level(base)的宽度。其他维度也是如此(GL 规范 2.1,第 3.8.8 节,段落 mipmapping)。

【讨论】:

  • 我只是(重新)阅读了 ARB_texture_non_power_of_two 的规范。它声明:“请注意,此扩展与支持其他 [舍入] 规则兼容,因为它只是放宽了 mipmap 的错误和完整性条件。”基于此,我会说四舍五入应该是可能的。
  • @Florian,您所读到的只是说该扩展是专门为不阻止进一步扩展而编写的。但是它之前的整页解释了为什么选择 floor (阅读该问题的第一段)。规范部分(不是问题列表)仅将 floor 作为公式列出。
猜你喜欢
  • 1970-01-01
  • 2016-02-05
  • 2014-03-16
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-16
相关资源
最近更新 更多