vik*_*eid 4 opengl multisampling glsl opengl-3
我在28byteslater.com上阅读了关于延迟着色的MSAA的本教程.
它说,在显式多重采样中,我们可以访问特定的样本.
难道我们不能从GL_TEXTURE_2D_MULTISAMPLE例如绑定的常规纹理中做同样的事情吗?
这是我之前用于访问单个样本的着色器代码(不使用明显的多重采样):
uniform sampler2DMS Diffuse;
ivec2 Texcoord = ivec2(textureSize(Diffuse) * In.Texcoord);
vec4 colorFirstSample = texelFetch(Diffuse, Texcoord, 0);
vec4 colorSecondSample = texelFetch(Diffuse, Texcoord, 1);
vec4 colorThirdSample = texelFetch(Diffuse, Texcoord, 2);
Run Code Online (Sandbox Code Playgroud)
我在显式多重采样中看到的唯一不同之处是它们texelFetchRenderbuffer()在着色器中使用并且纹理被绑定GL_TEXTURE_RENDERBUFFER_NV.加上如果我没记错,它在着色器中不可能使用RenderBuffer,现在我们可以吗?
我觉得你有点困惑.在OpenGL 3.2/DirectX 10出现之前,进行多重采样抗锯齿(MSAA)的唯一方法是对多重采样缓冲区进行blit并让它进行"解析"(将多个样本逐字解析为单个样本的过程)正常输出).这是关于所有多重采样也是有益的 - 它不能在着色器中明确使用.
GL3.2/DX10以多重采样纹理的形式引入了"显式"(可编程)多重采样分辨率.您在着色器中访问各个样本的方法是使用texelFetch (...).这个新功能允许MSAA在延迟着色引擎中实现,因为现在照明着色器能够在获取G-Buffers时对其进行多重采样.这一新功能还开辟了将多重采样缓冲区用于与抗锯齿无关的事物的可能性,通过称为Stencil Routed A-Buffering的技术立即想到了与顺序无关的透明度.
简而言之,DX10级硬件允许多重采样缓冲区作为纹理.这意味着必须对现有的着色语言(如HLSL和GLSL)进行很少的操作才能公开多重采样; 你会牺牲某些东西,如mipmap和过滤,但如果你这么倾向,你可以自己实现.然而,DX10缺少的一件事是支持多样本深度纹理 - DX10.1补充了这一点.
在OpenGL 3.2之前,有供应商特定的扩展(例如NV_explicit_multisample)允许多重采样纹理,因为自2007年以来硬件已经支持它(随着DX10的发布).在OpenGL 3.2实现中,忽略供应商特定的东西并简单地使用ARB_texture_multisample.