私は、シャドウマップを作成するためにGeForce GTX 750の下でOpenGL 4.3を使用しています。現在、以下のような基本的な効果が正しいと思われます。 ブロック効果を消去するには、シェーダーで2x2のPCFを手動で実行しようとしました。 アクセラレーションのために、グラフィックカードによって提供される利点を使用して、1つのフェッチで比較結果の線形フィルタを使用したいと考えています。しかし、その効果は上記とは異なります。 OpenGLは直線的に影のレンダリングをフィルタリングし、よりみたいですが、影地図でないフィルター:それは私は、ハードウェアのPCFを行う方法です以下 : は、私は気づいているという点で行う必要があり、基本的な二つのことハードウェアPCFを使用するため、以下のとおりです。私の場合には、samplerCubeShadow
あるshadow
型サンプラーを、(私は点光源のシーンを作成しようとしているので、私はキューブマップのタイプを使用しています)を使用してOpenGLを使用したシャドウマップのハードウェアPCF
- 。私の場合には、次のコードによって行われる比較モードおよびフィルタリングタイプ、設定し
:その後
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の完全版ではありません。
ですから、比較結果を平均化することによって、私はNVIDIAが実行する「直線補間」をやっていないよということを意味します、 右?あなたが以前に提供した資料をチェックしましたが、この補間がどのように行われたかについては何も言いません。それについてもっと詳しく教えていただけますか?どうも。 – Narusaki
@ Narusaki:線形補間です。これは、非比較の場合と同様に機能し、比較後の値に対する補間のみを行います。 –
ああ、私はあなたが意味するものを持っていると思う:線形補間は、 "コーナー座標"上の4つの値を平均化するのではなく、 "中心座標"から "重さ"としての4つの "コーナー座標"その場合の重みは0.25です。あれは正しいですか? – Narusaki