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

时间:2017-08-08 13:55:47

标签: opengl opengl-es multisampling

我正在尝试使用两个简单的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中我们可以确认上述呼叫是否正常工作? 或者,无论如何我们可以知道我的机器显卡是否支持此呼叫?

1 个答案:

答案 0 :(得分:2)

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

您可以通过两种方式进行多重采样:多重采样默认帧缓冲或多重采样FBO。后者只能通过显式为您的FBO创建多重采样图像来实现。我想你可以告诉你何时打电话给glRenderbufferStorageMultisampleglTexStorage2DMultisample,但这没关系,因为你可以问任何帧缓冲(FBO或默认),如果它有多个样本。

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

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

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

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