キューブマップを使用した環境マッピングと、2D テクスチャを使用した一方向のシャドウ マッピングを実行しましたが、すべての方向のシャドウ マッピングにキューブ マップを使用すると、多くの問題が発生します。
最近、取得していた深度値textureCube()
が常にゼロであることがわかりました。環境マップと 2D テクスチャのシャドウ マッピングと同様のコードを使用していたので、また gDEBugger がシャドウ マップがメモリに適切にコピーされていることを示しているため、この行が機能していると想定していました。
これは、シャドウ マッピング用のシェーダー コードの一部と、私のデバッグ テストです...
uniform samplerCube shadowMap;
varying vec3 worldFragPosition, worldLightPos;
...
vec3 lightToFrag;
float shadowMapDepth;
bool inShadow;
inShadow = false; //used to darken color at the end
if (shadowMapEnabled)
{
lightToFrag = worldFragPosition - worldLightPos;
shadowMapDepth = textureCube(shadowMap, lightToFrag).r;
if (shadowMapDepth > .75)
{
gl_FragColor = vec4(1.0, 0.0, 0.0, 0.0);
return;
}
else if (shadowMapDepth > .5)
{
gl_FragColor = vec4(0.0, 1.0, 0.0, 0.0);
return;
}
else if (shadowMapDepth > .25)
{
gl_FragColor = vec4(0.0, 0.0, 1.0, 0.0);
return;
}
else if (shadowMapDepth > 0.0)
{
gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);
return;
}
else if (shadowMapDepth < 0.0)
{
gl_FragColor = vec4(1.0, 0.0, 1.0, 0.0);
return;
}
else
{
//... shadow mapping code
}
}
はelse
常に取得され、壊れたシャドウ マッピング コードを使用してシーンがレンダリングされます (現在、比較される深度がゼロであるため、すべてがシャドウにあります)。
ゼロでないことを確認するために以前にテストし、ゼロに対してlightToFrag
明示的にテストしましshadowMapDepth
た(フロートであるにもかかわらず)。また、 の戻り値全体をテストして、textureCube(shadowMap, lightToFrag)
それがゼロ ベクトルであることを確認しました。
深度が常にゼロである理由について私が考えることができる唯一のことは、テクスチャが正しくバインドされていない場合ですが、何も忘れていないと思います...
samplerShadowMapLoc = glGetUniformLocation(progId, "shadowMap");
shadowMapEnabledLoc = glGetUniformLocation(progId, "shadowMapEnabled");
....
glUniform1i(shadowMapEnabledLoc, true);
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_CUBE_MAP, light->getShadowMap()->getShadowMapId());
glUniform1i(samplerShadowMapLoc, 3);
for (unsigned int i=0; i < objects.size(); i++)
if (objects.at(i)->getID() != light->getParent()->getID()) //don't draw light, it doesn't need shadows
render(objects.at(i));
glUniform1i(shadowMapEnabledLoc, false);
render(light->getParent());
glUniform1i(shadowMapEnabledLoc, false);
textureCube がゼロのベクトルを返す原因は何ですか? どんな助けでも大歓迎です。