我正在尝试使用两个简单的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中我们可以确认上述呼叫是否正常工作? 或者,无论如何我们可以知道我的机器显卡是否支持此呼叫?
答案 0 :(得分:2)
在一般情况下,查看您的实现是否支持多重采样很容易。
您可以通过两种方式进行多重采样:多重采样默认帧缓冲或多重采样FBO。后者只能通过显式为您的FBO创建多重采样图像来实现。我想你可以告诉你何时打电话给glRenderbufferStorageMultisample
或glTexStorage2DMultisample
,但这没关系,因为你可以问任何帧缓冲(FBO或默认),如果它有多个样本。
为此,您可以将帧缓冲区绑定到GL_DRAW_FRAMEBUFFER
并使用glGetIntegerv
调用GL_SAMPLE_BUFFERS
。如果该值为1,则缓冲区进行多次采样。您可以通过查询GL_SAMPLES
来获取样本数。
请注意,GL 4.5及更高版本允许您使用glGet(Named)FramebufferParameteriv
来查询这些参数,这样您就不必绑定FBO。
所有这一切,你有一个大问题。您在渲染中所做的任何事情都不会被多重采样。多重采样无法对纹理四边形进行抗锯齿处理。它仅在三角形的边缘执行抗锯齿。除非您打开每个样本着色(除非您不喜欢性能,否则不应该这样做),从纹素中获取的数据不会受到影响。
因此,即使进行多重采样,您的特定渲染操作也不会看到它的效果。