2017-04-12 62 views
1

我試圖深淺啓用多重採樣脫皮,而且具有不正確的數據在我的透明層,結束了一些問題。我用下面的檢查樣本(最初的片段),此證是有效的:在GLSL 4.1片段着色器使用「取消」與多重採樣

float depth = texelFetch(depthMinima, ivec2(gl_FragCoord.xy), gl_SampleID).r; 
if (gl_FragCoord.z <= depth) 
{ 
    discard; 
} 

uniform sampler2DMS depthMinima; 

我已經啓用其中depthMinima定義GL_SAMPLE_SHADING,如果我理解正確的話,應該導致片段着色器以每個樣本爲基礎被調用。如果情況並非如此,是否有辦法讓這種情況發生?

其結果是,第一層或兩個看起來差不多的,但(和我做8層),我開始變得垃圾值之下 - 大多是普通的藍色,有時從前面的層值。

這工作正常單採樣緩衝區,而不是多重採樣緩衝區。 discard關鍵字是否仍然放棄整個片段?

回答

1

我已經啓用GL_SAMPLE_SHADING,如果我理解正確,應該導致在每個樣本基礎上調用片段着色器。

僅僅啓用GL_SAMPLE_SHADING是不夠的。您還需要設置:

glMinSampleShading(1.0f) 

值爲1.0表示在幀緩存每個樣品應indpendently陰影。值0.0有效地允許GL忽略採樣率陰影。 0.0到1.0之間的任何值都允許GL僅覆蓋每個覆蓋片段內總樣本的子集。哪些樣本是陰影的,用於選擇片段樣本子集的算法是與實現相關的。

glMinSampleShading

換句話說1.0它告訴遮陽所有樣本。 0.5告訴它遮擋至少一半的樣本。

// Check the current value 
GLfloat value; 
glGetFloatv(GL_MIN_SAMPLE_SHADING_VALUE, &value); 

如果任GL_MULTISAMPLEGL_SAMPLE_SHADING被禁用然後樣品遮光沒有任何效果。

將會有每個片段的多個片段着色器調用,向其中每個樣本是所述片段的子集。換一種說法。示例着色指定了要爲每個片段處理的最小樣本數量。

如果GL_MIN_SAMPLE_SHADING_VALUE設置爲1.0那麼將針對每個樣本(在基元內)發出片段着色器調用。 如果其設置爲0.5然後就會有對每第二個樣本的着色器調用。

max(ceil(MIN_SAMPLE_SHADING_VALUE * SAMPLES), 1) 

每個正在他們的樣本位置(gl_SamplePosition)進行評估。 隨着gl_SampleID在於當前正在處理的樣本的索引。

應該丟棄每個樣本的基礎上的工作還是仍然只能工作每片段?

有或沒​​有樣本着色discard仍然只終止着色器的單個調用。

資源:

+0

謝謝,可惜這並沒有幫助(我有GL_MULTISAMPLE啓用,順便說一句)。應該在每個樣本的基礎上放棄工作,還是隻能按每個片段工作? –

+0

看看我的編輯。 – Vallentin

+0

@Vallentin:根據規範:「片段着色器中[gl_SampleID]的任何靜態使用都會導致整個着色器按每個樣本進行評估。」所以這些功能不應該是必需的。 –