glGenerateMipmap(),带有ARB_sparse_texture扩展名

时间:2017-07-14 15:46:31

标签: opengl textures opengl-4 compute-shader mipmaps

我使用ARB_sparse_texture extension使用非常大的虚拟3D纹理实时渲染体积效果。

我找不到有关它如何与自动mipmap生成(glGenerateMipmap())交互的信息。

我正确地用数据填充纹理的0级并正确提交使用过的块。一切都运作良好,但我也需要这个纹理的mipmap链,我不明白如何自动生成它(我在spec for ARB_sparse_texturespec for ARB_sparse_texture2中找不到任何关于它的内容。

如果我在填充0级后只使用glGenerateMipmap()会怎样? (我试过了,它开始急剧停止)

我应该手动计算并提交较粗糙级别的所有已用块,还可以使用计算着色器手动下采样数据? (最糟糕的变体。它的额外工作太多了)

有没有简单的方法(比如glGenerateMipmap()具有正常纹理)?

1 个答案:

答案 0 :(得分:1)

稀疏内存和mipmap生成之间的交互相当明显。 glGenerateMipmaps从基本mipmap级别读取数据,并将其写入所有级别,包括最高级别。使用稀疏内存时,从未提交的页面读取会产生未定义的数据,并且对未提交的页面的写入不起作用。

因此,如果基类中存在未提交的页面,则从中进行下采样将产生未定义的结果。如果mipmap链中存在未提交的页面,则对它们的写入将不会执行任何操作。由于稀疏纹理扩展不会改变glGenerateMipmaps的指定行为,因此生成过程将执行其读写操作,而不知道提交的页面。

基本上,如果你要打电话给glGenerateMipmaps,那么纹理稀疏就没什么意义了。除非您将未定义的值写入较低的mipmap级别,否则无法正常使用。

  

我试过了,它开始大幅停滞

嗯,是的。你有什么期望? glGenerateMipmaps内部使用渲染管道或计算着色器。无论哪种方式,它实际上都是一个渲染命令,因此它不是一个轻量级的操作。