我一直在尝试在使用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?
发布于 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后处理过程。
发布于 2016-12-04 10:57:21
有没有办法,我可以设计为使用一个非多重采样的屏幕外
的所有渲染,最终是一个使用EGL_SAMPLES的主多重采样的fbo?
不是以任何真正有用的方式。
帧缓冲区blits允许从单采样缓冲区到多采样缓冲区的blits。但它所做的就是为像素内的每个样本赋予与源样本相同的值。
Blitting无法生成新信息。所以你不会得到任何实际的抗锯齿效果。您将得到的是以一种效率低得多的方式存储的相同数据。
https://stackoverflow.com/questions/40953912
复制相似问题