使用FBO进行渲染到目标时,是否需要重新生成MipMaps?

3
假设需要使用mipmapping:
当我第一次为我的FBO分配渲染目标时,我调用glGenerateMipmapEXT(GL_TEXTURE_2D);。在完成对其的渲染后,我是否需要再次调用此函数以正确填充所有mipmapping级别,或者后续的渲染调用会同时渲染所有级别?
我有一个例子,在GL_LINEAR_MIPMAP_LINEAR最小过滤器启用时,我的一个对象正在淡出到<0,0,0,0>,我认为这是由于没有重新进行mipmapping造成的。
我查看了一些示例,并找到了一些连续的glGenerateMipmap调用的示例,但更多的示例则没有这样做。
你有什么看法?

文档的措辞让我相信您确实需要使用新的渲染调用来重新生成mipmaps:“glGenerateMipmap为活动纹理单元附加的纹理生成mipmaps。”也许您可以创建一个小的测试单元来验证这一点? - Victor Zamanian
好吧,我这样说吧。如果我不这样做,它就不起作用。如果我这样做,它就会起作用。我只是不确定,我是否做错了其他事情,或者是否有更好的方法去做它。 - Chad Mourning
1
你不一定非要这么做,但如果你不这样做,它可能不会按照你的期望工作。EXT_framebuffer_object在规范中非常明确:只有当你告诉OpenGL去构建mipmaps时,它才会构建,除了使用(已弃用的)GL_GENERATE_MIPMAP纹理对象状态。原因是,对于从FBO渲染的纹理,没有单一的好方法来知道何时进行构建,就像简单的纹理一样。所以,如果你不调用glGenerateMipmap,那么它仍然会“工作”(它将正常渲染并且不会崩溃),但是... - Damon
1
但它不会自动更新其他MIP级别。当然,这通常不是人们想要的(尽管在某些特殊情况下可能是)。虽然如此,这仍然比任何其他解决方案都要好。否则,由于OpenGL无法知道何时更新mip-maps或何时不更新,它将不得不在每个绘制调用之后进行更新以确保安全。那对性能来说将是可怕的。 - Damon
为当前绑定的纹理生成给定目标的mipmaps。Damon的评论应该是答案,所以我会点赞这两个评论! - CoffeDeveloper
1个回答

7

glGenerateMipmap函数会根据level[0]填充1到n级别的纹理。所以,是的,每当level[0]发生变化时,都应该调用它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接