タイトルが示すように、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);