屏幕效果和抗锯齿

我一直在使用glut进行基本的窗口创建。 我正在渲染到屏幕外的缓冲区,以便我可以实现各种效果,如屏幕鼓起,运动模糊,折射等。我还使用了抗锯齿(fxaa)的屏幕纹理。

现在我已经从过剩变成了sfml。 我打开内置的抗锯齿,它看起来比我的版本好多了,但现在我没有纹理的屏幕,所以我不能使用屏幕效果。

所以我的问题是,人们如何正常处理这个问题呢? 我可以利用sfml的抗锯齿function并保留我的效果吗? 我想过使用glReadPixels,但似乎太慢了。 sfml是否在幕后进行离屏渲染,并且可以访问该纹理?

这不是特定于sfml。 AAA游戏如何做到这一点? 他们总是执行自己的抗锯齿技术?

据我所知,SFML不提供自己的抗锯齿。 那么,当你创建一个新的窗口时,有一个可选参数用于抗锯齿级别。 但是这个超级示例反锯齿是graphics驱动程序而不是SFML的默认设置。 你也可以很容易的通过GLUT获得。

在内部,SFML不使用渲染纹理,我认为。 但是你有自己的class级。 它被命名为sf::RenderTarget 。 你可以渲染所有的派生类,包括sf::RenderTexture ,这可能正是你在找什么。

你可以使用原始的OpenGL渲染自己,并自己处理所有着色器,渲染目标和帧缓冲区。 或者你可以使用为这种情况提供的另一个SFML类。 如果我没有记错的话,它被称为sf::PostFX ,现在被重命名为sf::Shader 。 虽然我没有使用这些类,但是使用它们并应用效果似乎相当容易。 您阅读文档,这是很多描述用例的很好的一个。 但是由于SFML只有2Dfunction,我不确定你是否可以用它来做3D游戏。

几乎所有最近的AAA标题都使用延迟渲染,这意味着将多个属性(如深度,视图空间法线和纹理颜色)渲染为纹理。 可以通过读取这些纹理来应用阴影,以便几何graphics不会被多次绘制。 这比你想要做的还要进一步。 延迟渲染对计算大量灯光特别有用。

至less对于延迟渲染来说,抗锯齿仍然是一个大问题。 有各种各样的方法与他们的权衡。 但是在大多数情况下,超级采样速度会变慢,因为您必须对所有渲染的纹理进行超级采样,这种纹理会被快速放大。 一些游戏所做的是使用深度和正常信息检测硬边缘,并对这些像素应用模糊。 更简单的实现只读取颜色纹理,例如FXAA。 那些是你想要实现的。 这是一种伪造的抗锯齿,但它具有可接受的低性能折衷。

但是在开始改变游戏之前,整个游戏都会仔细考虑是否使用这些后期处理的抗锯齿algorithm。 如果你不使用延迟渲染,那么使用默认的超级采样很可能是没问题的。 可以通过将sf::ContextSettings传递给sf::Window实例来使用它。

消除锯齿仅仅是以更高的分辨率进行渲染,并将其放在屏幕上之前进行缩放。

你有没有考虑渲染到一个更大的屏幕外的纹理?