2

キューブマップを使用した環境マッピングと、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 がゼロのベクトルを返す原因は何ですか? どんな助けでも大歓迎です。

4

2 に答える 2

1

render-to-depth-cubemap をサポートするのは新しいハードウェアのみであり、最新のドライバーが必要です。また、サポートされている形式を使用している必要があります。カードの仕様を確認してください。しかし、それは最も明白な問題です。

于 2011-11-05T17:52:06.093 に答える
0

これはおそらくあまり役​​に立たないでしょう (私もキューブマップを使用して 1 回のパスでオムニ シャドウを行う正しい方法を知りたいのですが、見つけることができる情報はどれも私を助けるのに十分なほど完全ではありませんでした) しかし...

キューブマップに正しくレンダリングしていますか? この SO questionによると、キューブマップにレンダリングするにはジオメトリ シェーダーが必要です。

于 2011-11-11T21:52:27.947 に答える