如何确定 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 创建多重采样图像来实现。我认为您可以判断何时调用 glRenderbufferStorageMultisample
或 glTexStorage2DMultisample
,但这并不重要,因为您可以询问任何帧缓冲区(FBO 或默认)是否有多个样本。
为此,您可以将帧缓冲区绑定到 GL_DRAW_FRAMEBUFFER
并使用 GL_SAMPLE_BUFFERS
调用 glGetIntegerv
。如果该值为 1,则缓冲区被多重采样。查询GL_SAMPLES
.
即可得到样本数
请注意,GL 4.5及以上版本允许您使用glGet(Named)FramebufferParameteriv
查询这些参数,这样您就不必绑定FBO了。
综上所述,你有一个大问题。您在渲染中所做的任何事情都不会被多重采样。多重采样不能 消除纹理四边形的锯齿。它仅在 三角形 的边缘执行抗锯齿。除非您打开每个样本的着色(除非您不喜欢性能,否则您不应该打开),从纹理元素获取的数据将不会受到影响。
因此,即使正在进行多重采样,您的特定渲染操作也不会看到它的效果。
我正在尝试使用两个简单的 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 创建多重采样图像来实现。我认为您可以判断何时调用 glRenderbufferStorageMultisample
或 glTexStorage2DMultisample
,但这并不重要,因为您可以询问任何帧缓冲区(FBO 或默认)是否有多个样本。
为此,您可以将帧缓冲区绑定到 GL_DRAW_FRAMEBUFFER
并使用 GL_SAMPLE_BUFFERS
调用 glGetIntegerv
。如果该值为 1,则缓冲区被多重采样。查询GL_SAMPLES
.
请注意,GL 4.5及以上版本允许您使用glGet(Named)FramebufferParameteriv
查询这些参数,这样您就不必绑定FBO了。
综上所述,你有一个大问题。您在渲染中所做的任何事情都不会被多重采样。多重采样不能 消除纹理四边形的锯齿。它仅在 三角形 的边缘执行抗锯齿。除非您打开每个样本的着色(除非您不喜欢性能,否则您不应该打开),从纹理元素获取的数据将不会受到影响。
因此,即使正在进行多重采样,您的特定渲染操作也不会看到它的效果。