2017-04-12 7 views
1

私が有効になってマルチサンプリングとピーリングの深さをしようとし、誤ったデータが私の透明な層で終わるといくつかの問題を抱えているとGLSL 4.1フラグメントシェーダに「破棄」を使用します。 、マルチサンプリング

depthMinimaが、私は私が正しく理解していれば、 GL_SAMPLE_SHADINGを有効にしている

uniform sampler2DMS depthMinima; 

として定義されて

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

:私はサンプル(もともとフラグメント)は、このパスに有効であるかどうかを確認するには、次を使用しますフラグメントシェーダがサンプルごとに呼び出される必要があります。これが当てはまらない場合は、これを実現させる方法がありますか?主に平野青、時には前の層から値 -

結果は、第一の層または2つのルックの権利は、それ(と私は8層をやっている)私は取得を開始ジャンク値の下にあることです。

これは、単一のサンプリングバッファのではなく、マルチサンプリングバッファのために正常に動作します。 discardキーワードはフラグメント全体を破棄しますか?

答えて

1

正しく理解すれば、サンプルごとにフラグメントシェーダが呼び出される必要があるGL_SAMPLE_SHADINGが有効になりました。

GL_SAMPLE_SHADINGを有効にするだけでは不十分です。また、設定する必要があります。

glMinSampleShading(1.0f) 

1.0の値はフレームバッファ内の各サンプルはindpendently網掛けされなければならないことを示しています。 0.0の値を指定すると、GLはサンプルレートシェーディングを無視できます。 0.0〜1.0の間の任意の値は、GLが各カバーされたフラグメント内の全サンプルの部分集合のみを陰影付けすることを可能にする。どのサンプルが陰影付けされており、フラグメントのサンプルのそのサブセットを選択するために使用されるアルゴリズムは実装依存である。シェードにすべてのサンプルを、それを伝える1.0すなわち

glMinSampleShading

0.5は、サンプルの少なくとも半分を陰影付けするように指示します。 GL_MULTISAMPLEGL_SAMPLE_SHADINGのいずれかが、その後は無効になって

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

場合のサンプルシェーディングは効果がありません。

は、各サンプルは断片のサブセットである各断片のための複数のフラグメントシェーダ呼び出しに存在します。言い換えると。サンプルシェーディングは、各フラグメントに対して処理するサンプルの最小数を指定します。

GL_MIN_SAMPLE_SHADING_VALUE1.0に設定されている場合、プリミティブ内の各サンプルに対してフラグメントシェーダの呼び出しが発行されます。 0.5へのセットは、毎秒サンプル用のシェーダの呼び出しがあります場合。

max(ceil(MIN_SAMPLE_SHADING_VALUE * SAMPLES), 1) 

それぞれがサンプル位置(gl_SamplePosition)で評価されます。 gl_SampleIDで は、現在処理されているサンプルのインデックスであること。

サンプル単位で作業を破棄する必要がありますか、それともそれでもフラグメント単位でしか動作しませんか?

サンプルシェーディングの有無discardは、シェーダの1回の呼び出しを終了するだけです。

資源:

+0

おかげで、残念ながらこれは(ところで、私はGL_MULTISAMPLEを有効にしていない)助けにはなりませんでした。サンプル単位で作業を破棄しなければならないのですか、それともフラグメント単位でしか動作しませんか? –

+0

私の編集を見てください。 – Vallentin

+0

@Vallentin:仕様によると: "フラグメントシェーダで[gl_SampleID]を静的に使用すると、シェーダ全体がサンプルごとに評価されます。"したがって、これらの機能は必要ではありません。 –

関連する問題