如何确定 glEnable(GL_MULTISAMPLE) 是否适用于我的纹理?

How to find out if glEnable(GL_MULTISAMPLE) is working for my texture?

我正在尝试使用两个简单的 GLSL 着色器 window 完整显示图像:

顶点着色器:

#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 中我们是否可以确认上述调用是否有效? 或者无论如何我们可以查明我的机器显卡是否支持这个调用?

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

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

为此,您可以将帧缓冲区绑定到 GL_DRAW_FRAMEBUFFER 并使用 GL_SAMPLE_BUFFERS 调用 glGetIntegerv。如果该值为 1,则缓冲区被多重采样。查询GL_SAMPLES.

即可得到样本数

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


综上所述,你有一个大问题。您在渲染中所做的任何事情都不会被多重采样。多重采样不能 消除纹理四边形的锯齿。它仅在 三角形 的边缘执行抗锯齿。除非您打开每个样本的着色(除非您不喜欢性能,否则您不应该打开),从纹理元素获取的数据将不会受到影响。

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