【问题标题】:How to find out if glEnable(GL_MULTISAMPLE) is working for my texture?如何确定 glEnable(GL_MULTISAMPLE) 是否适用于我的纹理?
【发布时间】:2017-08-08 22:49:21
【问题描述】:

我正在尝试使用两个简单的 GLSL 着色器在全窗口中显示图像:

顶点着色器:

#version 330

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;

out vec3 ourColor;
out vec2 TexCoord;

void main()
{
    TexCoord = aTexCoord;
    gl_Position = vec4(aPos, 1.0);
}

和片段着色器:

#version 330

uniform sampler2D tex0; // loading the texture here

in vec3 TexCoord; // texture coordinates
out vec4 fColor; // fragment shader output

void main(){
   fColor = texture2D(tex0,TexCoord);
}

在 OpenGL 代码中,在 OpenGL 属性设置期间,我执行

glEnable(GL_MULTISAMPLE);

我在网上看到,只有在驱动程序支持的情况下,OpenGL 才会执行多重采样。

在 OpenGL 中我们是否可以确认上述调用是否有效? 或者无论如何我们可以找出我的机器显卡是否支持这个调用?

【问题讨论】:

  • 我不知道这取决于驱动程序的能力。这绝对取决于您的渲染目标是否支持多重采样,但这与驱动程序没有直接关系。
  • 我正在检查一些示例代码来执行此操作,我遇到了这个文件:example code 在此搜索中 glEnable(GL_MULTISAMPLE) 。有评论提到其基于驱动程序。有没有办法确认渲染目标是否支持多重采样?
  • 从第一个角度来看,我没有看到与链接中的粗体文本类似的内容。我看到的唯一说明是关于默认情况下是否启用了多重采样。如果您的窗口系统可以为您提供多重采样窗口/后缓冲区和 OpenGL 上下文 > 1.3,那么多重采样必须工作。
  • 是否启用多重采样与是否支持多重采样无关。它只是指定是否应该使用多重采样。

标签: opengl opengl-es multisampling


【解决方案1】:

在一般情况下,查看您的实现是否支持多重采样很容易。

您可以通过两种方式获得多重采样:多重采样的默认帧缓冲区,或多重采样的 FBO。后者只能由您明确为您的 FBO 创建多重采样图像来实现。我想你可以知道你何时调用glRenderbufferStorageMultisampleglTexStorage2DMultisample,但这并不重要,因为你可以询问任何帧缓冲区(FBO 或默认)是否有多​​个样本。

为此,您可以将帧缓冲区绑定到GL_DRAW_FRAMEBUFFER 并使用GL_SAMPLE_BUFFERS 调用glGetIntegerv。如果该值为 1,则对缓冲区进行多重采样。可以通过查询GL_SAMPLES获取样本数。

请注意,GL 4.5 及以上版本允许您使用glGet(Named)FramebufferParameteriv 来查询这些参数,这样您就不必绑定FBO。


说了这么多,你有一个大问题。您在渲染中所做的任何事情都不会被多重采样。多重采样不能对带纹理的四边形进行抗锯齿处理。它只在三角形的边缘执行抗锯齿。除非您打开逐样本着色(除非您不喜欢性能,否则不应该这样做),从纹素获取的数据不会受到影响。

所以即使多重采样正在进行,您的特定渲染操作也不会看到它的效果。

【讨论】:

    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多