2016-05-18 53 views
1

如果我通過sampler2DMS訪問GLSL中的多重採樣紋理,如何知道該多重採樣紋理的紋理元素中的哪些樣本實際上已被覆蓋?sampler2D texel的GLSL訪問覆蓋掩碼

從多重採樣擴展參考: 「...的每個像素片段從而由整數X和Y網格座標,顏色,SAMPLES_ARB深度值,紋理座標,並與最大SAMPLES_ARB比特的覆蓋值」。

所以我想訪問texel的覆蓋率值。我可以使用gl_SampleMask(https://www.opengl.org/sdk/docs/man/html/gl_SampleMask.xhtml)來寫入當前正在處理的FRAGMENT的coverage值,但是如何訪問我從多重採樣紋理中讀取的TEXEL的coverage值?

回答

3

多重採樣的想法是,當您渲染到多重採樣圖像時,您只爲每個像素大小的區域執行一次片段着色器。光柵化器生成的覆蓋掩模確定片段輸出到像素內的哪些樣本。

但是一旦這個過程完成,一旦片段着色器寫入其數據,多采樣圖像本身完全不知道這些覆蓋掩碼是什麼。多采樣紋理只是每個紋理元素具有多個採樣值。它不知道哪些片段會產生哪個樣本與哪個樣本進行遮罩。

示例蒙版只是渲染的一部分。

想想這樣吧。這是一個多重採樣紋理的像素:

vec4 pixel[SAMPLE_COUNT]; 

你的片段着色器,當你渲染到多重採樣的紋理,做了這個相當於:

for(int sample_ix = 0; sample_ix < SAMPLE_COUNT; ++sample_ix) 
{ 
    if(sampleMask[sample_ix]) 
    pixel[sample_ix] = output; 
} 

pixel的數據可能最初來自樣本面具。但pixel不知道發生了這種情況;它只是一個vec4值的數組。

您可以獲得當前片段的覆蓋率值。但這與用於最初組成多采樣紋理中的像素的實際覆蓋值無關。

+0

謝謝Nicol,這是一個非常明確和可以理解的解釋!作爲一個相關的問題,是否可以輕鬆地(無需迭代)檢查多重採樣紋理中的紋理樣本是否全部相同? – user1282931

+0

@ user1282931:Nope;)雖然它會很好,但他們只是不存儲這些信息。 –