【问题标题】:What does my choice of GLFW_SAMPLES actually do?我选择的 GLFW_SAMPLES 实际上有什么作用?
【发布时间】:2017-08-08 11:14:10
【问题描述】:

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

我阅读了 glfw.org 上的描述(参见此处:GLFW Window Guide),位于“帧缓冲区相关提示”部分下。手册说“GLFW_SAMPLES 指定用于多重采样的所需样本数量。零禁用多重采样。GLFW_DONT_CARE 表示应用程序没有偏好。”

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

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

glfwWindowHint(GLFW_SAMPLES, 4); 会。

【问题讨论】:

    标签: opengl graphics glfw multisampling


    【解决方案1】:

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

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

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


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

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

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

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


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

    【讨论】:

    • FXAA 是否有 GLFW 提示? AA 教程链接不包含“FXAA”,尽管它确实提到了编写一个着色器来执行自定义 AA。
    • @TankorSmash FXAA 是在着色器中完成的后处理效果。维基百科页面上的一些参考资料详细说明了它的工作原理。但本质上,对于每个像素,您平均 n 个周围的纹素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多