2013-10-19 62 views
4

我正在閱讀來自28byteslater.com的MSAA中延遲着色的this tutorial顯式多重採樣與OpenGL中的常規多重採樣有何不同

它說,在明確的多重採樣中,我們可以訪問特定的樣本。

難道我們不能從一個普通的紋理來做同樣的事嗎?例如,它會綁定到GL_TEXTURE_2D_MULTISAMPLE

這是我用來較早用於訪問個別樣品的shader代碼(不使用顯式的多采樣):

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); 

不同的外顯的多采樣我唯一看到的是,他們在着色器使用texelFetchRenderbuffer()並且紋理綁定到GL_TEXTURE_RENDERBUFFER_NV。 如果我沒有記錯的話,它不可能在着色器中使用RenderBuffer,現在我們可以嗎?

+2

您的鏈接已被打破。 – Ruslan

回答

7

我覺得你有點困惑。在OpenGL 3.2/DirectX 10出現之前,進行多重採樣消除鋸齒(MSAA)的唯一方法是對多采樣緩衝區進行blit處理,並讓其執行「分辨率」(將多個採樣從字面上解析爲單個採樣的過程正常輸出)。這是關於所有多抽樣也是有益的 - 它不能在着色器中明確使用。

GL3.2/DX10引入了「顯式」(可編程)多采樣解析,採用多采樣紋理的形式。在着色器中訪問單個樣本的方式是使用texelFetch (...)。這個新功能允許MSAA在延遲着色引擎中實現,因爲現在照明着色器能夠在獲取G-Buffers時多重採樣解析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

+0

感謝您回答Andon。因此總結一下你的答案:NV_explicit_multisample不再是供應商特定的,現在(OGL 3.2以上版本)它已經成爲核心OGL的一部分。我之前提到的OpenGL代碼(sampler2DMS,texelFetch)是在OGL 3.2+中使用它的新方法嗎? – viktorzeid

+0

或多或少。從技術上講,'ARB_texture_multisample'是替代'NV_explicit_multisample'的非供應商特定的擴展。這種ARB擴展可能在非3.2實現中可用,但所有3.2+實現都可以保證提供它。 –