2017-07-14 136 views
1

我使用ARB_sparse_texture extension呈现实时立体效果,使用非常大的虚拟3D纹理。glGenerateMipmap()与ARB_sparse_texture扩展

而且我可以找到关于它如何与自动纹理贴图代(glGenerateMipmap())进行交互的任何信息。

我正确地用数据填充纹理的0级,并正确提交使用的块。一切运作良好,但我也需要这种纹理的mipmap链,我不知道如何自动完成它(我发现它在spec for ARB_sparse_texturespec for ARB_sparse_texture2)。

,如果我只是填补了0级后使用glGenerateMipmap()会发生什么? (我试过了,它开始大幅失速)

我应该手动计算并提交所有在较粗糙级别使用的块,并且还使用计算着色器手动下采样数据? (最坏的变种,它是太多额外的工作)

有没有什么简单的方法来做到这一点(如glGenerateMipmap()与正常纹理)?

+1

@genpfault:[提问者发表的评论](https://stackoverflow.com/questions/45107006#comment77197450_45107902)显示在链接中使用描述性词语(例如,“ARB_sparse_texture规范”)是多么有益比“隐藏”在运行文本(例如,“在”字和“规范”的背后)这些链接。 –

+0

@PeterO:不够公平,对我的作品! – genpfault

回答

1

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

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

基本上,如果你要调用glGenerateMipmaps,存在具有质地稀疏的小点。除非你编写未定义的值来降低mipmap级别。

我试了一下,就开始拖延大幅

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

+0

感谢您的回答。 你不完全正确的约undefined data in uncommited regions。 根据更新后的规范(https://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_sparse_texture2.txt)从着色器中的uncommited区域读取返回零,这对我来说是合适的。但是再次没有关于glGenerateMipmap的说法,它是否与基于着色器的渲染行为不符?对我而言,这并不明显。 – simpetar

+0

简而言之,你的意思是我应该手动计算并提交更粗糙级别的所有使用的块,然后(在承诺所有块之后)可以使用glGenerateMipmap()自动缩减采样,并且在此之后它将至少是正确的缓慢,因为它试图缩小一切,甚至无限的区域)? – simpetar

+0

我期待什么?我有一个非常非常微小的希望,它的行为逻辑上并且为我做了所有肮脏的工作(计算并提交只需要的块和仅下载现有数据)。在稀疏分配纹理的情况下,对于高级自动mipmap生成函数来说,这是绝对正常的行为。但唉... – simpetar