2017-08-08 39 views
0

我想显示使用两个简单GLSL着色器在全窗口图像:如何找出glEnable(GL_MULTISAMPLE)是否适用于我的纹理?

顶点着色器:

#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

我不知道这取决于驱动程序的功能。这绝对取决于渲染目标是否支持多重采样,但这与驱动程序没有直接关系。 – BDL

+0

我被检查一些示例性代码来执行这一点,我跨越这个文件传来: [例如码(https://learnopengl.com/code_viewer.php?code=advanced/anti_aliasing_multisampling) 在该搜索** glEnable(GL_MULTISAMPLE)**。 有一个评论提及其驱动程序的基础。 有没有办法确认渲染目标是否支持多重采样? –

+0

从第一个角度来看,我没有看到任何与你的链接中的粗体文本相似的东西。我看到的唯一说明是关于是否默认启用多重采样。如果你的窗口系统可以给你一个多采样窗口/ backbuffer和一个OpenGL上下文> 1.3,那么multisampling必须工作。 – BDL

回答

1

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

您可以通过两种方式获得多重采样:多重采样默认帧缓冲器或多重采样FBO。后者只能由您明确为您的FBO创建多重采样图像。我想你可以告诉你什么时候拨打glRenderbufferStorageMultisampleglTexStorage2DMultisample,但这并不重要,因为如果有多个采样,你可以询问任何帧缓冲器(FBO或默认)。

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

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


所有这些都说了,你有一个大问题。您在渲染中所做的任何事都不会被多重采样。多重采样不能抗混叠纹理四。它只在三角形的边缘执行反走样。除非你打开每个样本的阴影(除非你不喜欢性能,否则你不应该这样做),从纹理中提取的数据不会受到影响。

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

相关问题