首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将非多采样FBO复制到多采样FBO

将非多采样FBO复制到多采样FBO
EN

Stack Overflow用户
提问于 2016-12-04 07:59:42
回答 2查看 435关注 0票数 1

我一直在尝试在使用GLES 3的应用程序中实现渲染到纹理的方法,我已经让它工作了,但我对帧速率的下降感到有点失望。

到目前为止,我们已经直接渲染到主FBO,这是一个使用EGL_SAMPLES=8创建的多采样FBO。

基本上,我想要的是在我还在绘图的同时,能够掌握已经绘制的像素。所以我认为渲染到纹理的方法应该能做到这一点。然后,我只需要在任何时候读取屏幕外FBO的纹理的一部分,当我完成对它的渲染时,我会将整个东西blit到主FBO。

深入研究这一点,我发现我必须实现一个具有多采样FBO以及非多采样纹理FBO的系统,其中我必须解析多采样FBO。然后,只需将已解析的内容传送到主FBO。

这一切工作,但问题是,通过使用上述系统和非多采样主FBO (EGL_SAMPLES=0),我得到了相当大的帧速率下降时,我得到的帧速率时,我只使用主FBO与EGL_SAMPLES=8。

深入研究这一点,我发现人们在网上报告了这一点,还有一篇文章在https://community.arm.com/thread/6925上说,多重采样最快的方法是使用EGL_SAMPLES。事实上,这也是杰森tk1上的样子,也是我们的目标板。

这最终引出了我的问题,并为冗长的介绍道歉:

有没有办法,我可以设计为使用一个非多采样的屏幕外的fbo的所有渲染,最终是一个使用EGL_SAMPLES的主多采样FBO?

EN

回答 2

Stack Overflow用户

发布于 2016-12-05 19:48:29

MSAA的唯一目的是消除几何体边缘的锯齿。只有当多个三角形边缘出现在同一像素中时,它才能提供好处。对于执行多个屏幕外过程的渲染管道,需要为包含几何体的屏幕外过程启用多个采样(通常是管道中的早期过程之一,在任何后期处理效果之前)。

在最终的blit管道末尾应用MSAA将提供零收益,并且可能不是免费的(它将在基于瓷砖的渲染器上接近免费,如IMG Series 6和Mali (您链接的博客),在即时模式渲染上较少免费,如Jetson board中的Nvidia )。

注意:对于屏幕外的抗锯齿,“标准”方法是渲染到MSAA帧缓冲区,然后作为第二遍进行解析(例如,使用glBlitFramebuffer将其转换为单个采样缓冲区)。这种反弹在许多架构上都是低效的,所以这个扩展的存在是为了帮助:

这实际上提供了与EGL窗口表面功能相同的隐式解析。

在评论中回答了你的问题。

在这种情况下,生成的纹理是多采样纹理吗?

从应用程序的角度来看,没有。多采样数据位于隐式分配的缓冲区中,该缓冲区由驱动程序分配。请参阅规范中的这一部分:

该实施使用TEXTURE_SAMPLES_EXT样本以及与指定纹理级别相同的内部格式、宽度和高度分配隐式多样本缓冲区。

这可能需要在一些GPU架构上的主内存中进行实际的MSAA缓冲区分配(因此不会比没有扩展的手动glBlitFramebuffer方法更快),但已知在其他架构上是有效释放的(即,基于瓦片的GPU,其中隐式“缓冲区”是GPU内的小随机存取存储器,而根本不在主内存中)。

的目标是模糊小工具背后的背景

MSAA在任何情况下都不是一种通用的模糊-它只是对与三角形边缘重合的像素进行反走样。如果要模糊三角形的面,最好使用可分离的高斯模糊实现为一对片段着色器,并将其实现为2D后处理过程。

票数 1
EN

Stack Overflow用户

发布于 2016-12-04 10:57:21

有没有办法,我可以设计为使用一个非多重采样的屏幕外

的所有渲染,最终是一个使用EGL_SAMPLES的主多重采样的fbo?

不是以任何真正有用的方式。

帧缓冲区blits允许从单采样缓冲区到多采样缓冲区的blits。但它所做的就是为像素内的每个样本赋予与源样本相同的值。

Blitting无法生成新信息。所以你不会得到任何实际的抗锯齿效果。您将得到的是以一种效率低得多的方式存储的相同数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40953912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档