0

タイトルが示すように、sampler2DShadow を使用すると、マルチサンプリング FBO のライティング シェーダーでエラーが発生しますが、マルチサンプリングを使用しない標準の遅延レンダリング設定を使用して非常によく似た構成を使用しているため、問題を検出できません。

openlGL の sampler2DShadow とマルチサンプリングに互換性の問題がありますか、または使用すべき代替手段はありますか?

シェーダーは正常にコンパイルされます。

この行を実行するまで、コードは正常に機能します。

texture(gShadowMap2D, vec3(pCoord.xy, (pCoord.z) / pCoord.w));

結果を取得します。次に、GL_INVALID_OPERATION を取得します。

シャドウ マップはディレクショナル ライト (デプス マップは有効で表示可能) からのもので、標準テクスチャ (GL_TEXTURE_2D) に設定された GL_COMPARE_R_TO_TEXTURE を使用します。

マルチサンプリング遅延 FBO テクスチャは GL_TEXTURE_2D_MULTISAMPLE を使用します。

glsl 330 (openGL 3.3 コア プロファイル) を使用しています。

アップデート

問題は、マルチサンプリング フラグメント シェーダーの位置マップからワールド位置を取得することに関連していると思います。

標準的な方法:

vec3 worldPos = texture(gPositionMap, texCoord).xyz;

マルチサンプリングの方法:

vec2 texCoordMS = floor(vertTextureSize * texCoord.xy);

for(int i = 0; i < samples; i++)
{
    worldPos += texelFetch(gPositionMapMS, ivec2(texCoordMS), i).xyz;
}

worldPos = worldPos / samples;

(他のサンプラーは省略しました。)

sampler2DShadow (pCoord は worldPos を使用して計算されます) にアクセスしようとすると、エラーがスローされる境界を超えていると思います。

次に、このマルチサンプリングされた worldPos を取得して、標準的な方法と同じ結果を得る方法を見つけますか???

標準的な方法 (mDepthVP = mat4 (ライトの深度ビュー プログラム):

vec4 coord = gLight.mDepthVP * vec4(worldPos, 1.0);
4

1 に答える 1

0

さて、この問題が発生した理由についてのヒントを 1 つでも探し求めて必死に髪を引っ張った後、ようやくその原因を突き止めましたが、なぜ問題が発生したのかは完全にはわかりません。

ジオメトリ パス中 (ライティング パスの前) に、モデルは期待どおりの位置、色 (拡散)、法線、および深度ステンシルにレンダリングされます。このパスの間、バインドされたテクスチャ (メッシュの拡散テクスチャ) を渡しますが、ユニット ゼロ (GL_TEXTURE0) の標準テクスチャ (GL_TEXTURE_2D) としてのみです (現在は拡散のみを使用しています)。

4 つの FBO テクスチャを読み取り用にバインドするときに、ライティング パスがそのユニットをオーバーライドするため、システムが機能するまでそのままにしました。ただし、マルチサンプリング FBO では、それらはマルチサンプリング テクスチャ (GL_TEXTURE_2D_MULTISAMPLE) としてバインドされていましたが、「位置」マップがユニット ゼロ (GL_TEXTURE0) を使用していたことが起こりました。

何らかの理由で、以前にバインドされたユニットがジオメトリ パスから上書きされず、GL_INVALID_OPERATION エラーが発生しました。呼び出し後:

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, 0); 

ジオメトリパスの直後に問題はなくなりました。

私が尋ねる質問は、「なぜ上書きしなかったのか」ということになります。

于 2014-01-13T04:51:57.513 に答える