通过 FBO 使用 Render to Target 时是不是需要重新生成 MipMap?

Posted

技术标签:

【中文标题】通过 FBO 使用 Render to Target 时是不是需要重新生成 MipMap?【英文标题】:Is regeneration of MipMaps when using Render to Target via FBOs required?通过 FBO 使用 Render to Target 时是否需要重新生成 MipMap? 【发布时间】:2011-03-13 20:01:42 【问题描述】:

假设 mipmapping 是可取的:

我调用 glGenerateMipmapEXT(GL_TEXTURE_2D);当我第一次为我的 FBO 分配渲染目标时。当我完成渲染后是否必须再次调用它以正确填充所有 mipmapping 级别,或者后续渲染调用是否同时渲染到所有级别?

我有一个例子,当最小过滤器 (GL_LINEAR_MIPMAP_LINEAR) 启动时,我的一个对象正在淡入 ,我假设渲染后没有重新进行 mipmapping 会导致这种情况。

我浏览了几个示例,发现有几个示例在其中进行了后续 glGenerateMipmap 调用,但更多的是没有调用的地方。

意见?

【问题讨论】:

文档的表述方式让我相信您确实需要使用新的渲染调用重新生成 mipmap:“glGenerateMipmap 为附加到活动纹理目标的纹理生成 mipmap单元。”也许您可以制作一个小型测试单元来验证这一点? 好吧,我就这么说吧。如果我不这样做,它就行不通。如果我这样做,它确实有效。我只是不确定,如果我做错了什么,或者是否有更好的方法来解决它。 您不一定必须这样做,但如果您不这样做,那么它可能不会按您期望的方式工作。 EXT_framebuffer_object 在规范中非常清楚:除了(已弃用的)GL_GENERATE_MIPMAP 纹理对象状态之外,当且仅当您告诉 OpenGL 执行此操作时,才会构建 mipmap。原因是对于从 FBO 渲染的纹理,没有单一的好方法可以知道何时执行此操作,因为只有纹理。所以,如果你不调用 glGenerateMipmap,那么它仍然会“工作”(它会渲染得很好并且不会崩溃),但是...... ... 但它不会自动更新其他 mip 级别。当然,这通常不是人们想要的(尽管在某些特殊情况下,它可能是)。不过,这比任何其他解决方案都要好。否则,由于 OpenGL 无法知道何时或何时不更新 mip-map,因此为了安全起见,它必须在每次绘制调用之后都进行更新。这对性能来说会很糟糕。 为给定目标的当前绑定纹理生成 mipmaps.. Damon cmets 应该是答案,所以我赞成 cmets :D(两者!) 【参考方案1】:

glGenerateMipmap 将根据级别 [0] 填充级别 [1,..,n]。所以是的,你应该在你的 level[0] 改变时调用它。

【讨论】:

以上是关于通过 FBO 使用 Render to Target 时是不是需要重新生成 MipMap?的主要内容,如果未能解决你的问题,请参考以下文章

Cesium原理篇:6 Render模块(4: FBO)

如何对动画Armature变成灰色 shader使用

EnvironmentNotWritableError: The current user does not have write permissions to the targe...

使用 render_to_string 时创建的真实性令牌不同

在 Android 上使用 FBO 进行慢速 OpenGL ES 渲染到纹理乒乓球

我是不是需要在我的 FBO 中使用 RenderBuffer 对象来渲染到保留 Alpha 通道的纹理?