我选择 GLFW_SAMPLES 的实际作用是什么?

What does my choice of GLFW_SAMPLES actually do?

设置这个变量有什么作用?例如,如果我将它设置为 4,那是什么意思?

我在 "Framebuffer related hints" 部分阅读了关于 glfw.org 的描述(参见此处:GLFW Window Guide)。手册说 "GLFW_SAMPLES specifies the desired number of samples to use for multisampling. Zero disables multisampling. GLFW_DONT_CARE means the application has no preference."

我还阅读了一般的多重采样描述(参见此处:Shawn Hargreaves 的 Multisampling)。

我对多重采样的含义有一个粗略的了解:在调整图像大小和重绘图像时,用于重绘图像的点数应该足够接近,以便我们看到的是图像的准确表示。同样的想法也出现在数字示波器上——假设您正在对正弦信号进行采样。如果采样率刚好恰好等于波的频率 (f),则示波器会显示恒定电压,这与您希望看到的输入信号有很大不同。为避免这种情况,奈奎斯特定理告诉我们应该以至少 2f 的速率进行采样。所以我看到计算机图形学怎么会出现问题,但我不知道具体的功能是什么

glfwWindowHint(GLFW_SAMPLES, 4); 会。

What does setting this variable do? For instance, if I set it to 4, what does that mean?

GLFW_SAMPLES用于启用多重采样。所以 glfwWindowHint(GLFW_SAMPLES, 4) 是一种在您的应用程序中启用 4x MSAA 的方法。

4x MSAA 表示 window 缓冲区的每个像素由 4 个子样本组成,也就是说每个像素由 4 个像素组成。因此,大小为 200x100 像素的缓冲区实际上是 800x400 像素。


如果您要创建一个比屏幕大 4 倍的额外帧缓冲区。然后将它用作纹理采样器,使用 GL_LINEAR 作为过滤器,基本上可以达到相同的结果。 请注意,这仅适用于 4x MSAA,因为 GL_LINEAR 仅采用最接近相关像素的 4 个样本。

谈到抗锯齿,使用 MSAA 是一种非常有效但昂贵的解决方案。如果你想要一个非常干净和漂亮的结果,那么它绝对是要走的路。通常选择 4x MSAA,因为使用它可以很好地平衡质量和性能。

就性能而言更便宜的替代方案是使用 FXAA。这是作为 post 处理步骤完成的,通常是免费的。不同之处在于,MSAA 以更大的尺寸进行渲染,然后将采样率降低到所需的尺寸,而不会损失任何质量。而 FXAA 只是按原样对像素进行平均,基本上使图像模糊。 FXAA 通常会给出非常不错的结果。

此外,您的驱动程序很可能会默认启用它。但如果没有,则使用 glEnable(GL_MULTISAMPLE).


最后,如果您还没有阅读过,我强烈建议您阅读 LearnOpenGL's Anti-Aliasing 教程。它对所有这些都给出了非常深入的解释。