2016-07-28 3 views
0

私は、シャドウマップを作成するためにGeForce GTX 750の下でOpenGL 4.3を使用しています。現在、以下のような基本的な効果が正しいと思われます。 enter image description here ブロック効果を消去するには、シェーダーで2x2のPCFを手動で実行しようとしました。 enter image description here アクセラレーションのために、グラフィックカードによって提供される利点を使用して、1つのフェッチで比較結果の線形フィルタを使用したいと考えています。しかし、その効果は上記とは異なります。 OpenGLは直線的に影のレンダリングをフィルタリングし、よりみたいですが、影地図でないフィルター:それは私は、ハードウェアのPCFを行う方法です以下 enter image description here : は、私は気づいているという点で行う必要があり、基本的な二つのことハードウェアPCFを使用するため、以下のとおりです。私の場合には、samplerCubeShadowあるshadow型サンプラーを、(私は点光源のシーンを作成しようとしているので、私はキューブマップのタイプを使用しています)を使用してOpenGLを使用したシャドウマップのハードウェアPCF

  1. 。私の場合には、次のコードによって行われる比較モードおよびフィルタリングタイプ、設定し
  2. :その後

    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); 
    

を、私はこのようなシェーダでtexture機能を使用します(理由

vec4 posInLight4D = positionsInLight/positionsInLight.w; // divided by the 4-th component) 
vec3 texCoord = GetCubeMapTexCoord(posInLight4D.xy); // get the texture coordinate in cube map texture. This can be assumed correct 
float lightness = texture(shadowMapHardware, vec4(texCoord, posInLight4D.z)); 
:後者は、それは明らかにまだサポートされていない vec5タイプ)が必要になりますので、キューブマップの影テクスチャをサポートしていないようですので、私は textureなく textureProjが使用することを3210

しかし残念ながら、これは3番目の画像に示された結果を与えます。

私の知る限り比較モード線形フィルタの設定で、それを理解するように、グラフィックスカードは、近くの2x2の領域内で比較を行いますとは直線的な結果を補間し、それを与えますtexture機能を介して戻る。私はすべての必要な部分をやったと思うが、私はまだ2番目の画像に示された正確な結果を得ることができません。

誰かが私が間違っているかもしれないところについて私に何か示唆を与えることはできますか?どうもありがとう。

PS:興味深いのは、次のとおりです。私は唯一の比較結果を返しますがないフィルタリングを行うtextureGather機能を、試みたが、第二画像に示すように、正確な結果を与えます。しかし、これは自動フィルタリング手順がなく、明らかにハードウェアPCFの完全版ではありません。

答えて

2

ブロック効果を消去するには、シェーダで2x2 PCFを手動で実行しようとしました。

OpenGL仕様では、奥行き比較を線形補間するときに使用される特定のアルゴリズムを指定していません。次の結果が得られます。しかし、それは一般的として説明:

これの詳細は実装依存であるが、rは 範囲内の値であるべきである[0,1]比較 パスまたは失敗の数に比例します。

これはあまり制約を受けておらず、「正しい」と見なされる出力は必要ありません。

実際、actual PCFは、あなたが望むものとはかなり異なっています。あなたが望むように見えるものは、まだ非常にぼろぼろです。それはちょうどバイナリブロックではありません。あなたのアルゴリズムは、比較結果の間で直線的に補間しませんでした。あなたはちょうど4つの最も近い比較を行い、それらを一緒に平均しました。

PCDが実際にとしているのは、と思われるものです。サンプリングするポイントに基づいて比較結果間の線形補間をします。

NVIDIAではなく、あなたの期待は間違っています。

+0

ですから、比較結果を平均化することによって、私はNVIDIAが実行する「直線補間」をやっていないよということを意味します、 右?あなたが以前に提供した資料をチェックしましたが、この補間がどのように行われたかについては何も言いません。それについてもっと詳しく教えていただけますか?どうも。 – Narusaki

+1

@ Narusaki:線形補間です。これは、非比較の場合と同様に機能し、比較後の値に対する補間のみを行います。 –

+1

ああ、私はあなたが意味するものを持っていると思う:線形補間は、 "コーナー座標"上の4つの値を平均化するのではなく、 "中心座標"から "重さ"としての4つの "コーナー座標"その場合の重みは0.25です。あれは正しいですか? – Narusaki

0

@ニコルの答えで、私は補間の意味を誤解していると思う。続いて、質問に正確に第二絵のように見えた、シェーダレベルの補間の私の実装です: enter image description here

関連する問題