我已经做了环境映射,使用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返回零矢量?任何帮助,将不胜感激。
也许看看[这](http://http.developer.nvidia.com/GPUGems/gpugems_ch12.html),帮助,刚开始进入它,所以不能真正帮助你... – niktehpui