2011-10-31 77 views
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返回零矢量?任何帮助,将不胜感激。

+0

也许看看[这](http://http.developer.nvidia.com/GPUGems/gpugems_ch12.html),帮助,刚开始进入它,所以不能真正帮助你... – niktehpui

回答

1

只有较新的硬件支持渲染到深度立方体贴图,并且您必须具有最新的驱动程序。另外,您必须使用受支持的格式;检查你的卡的规格,以确保。但这是最明显的可能问题。

+0

感谢您的回复。我的笔记本电脑配有ATI Mobility Radeon HD 4200显卡。我能够在http://feedback.wildfiregames.com/report/opengl/device/Mobility%20Radeon%20HD%204200找到它支持深度立方体贴图。我更新了我的驱动程序(v 11.11)。我不确定如何找出究竟支持哪种深度格式,但我一直在尝试使用我用于2d纹理的单向阴影贴图:GL_DEPTH_COMPONENT。我只给了16位和32位版本一个快速测试,但没有运气。 – CCSeth

0

这可能不会有太大的帮助(我也想知道正确的方式来做一个立方体贴图的全景阴影,没有任何信息我可以找到足够完整,以帮助我)但.. 。

你确定你正在渲染到你的cubemap吗?根据this SO question,你需要一个几何着色器来渲染一个立方体贴图。

+0

感谢您的回复。我不记得我发现提及使用几何着色器的任何资源。我认为这个问题涉及其同样目的的应用。我几乎肯定我正在渲染到立方体贴图,因为当我在gDEBugger工具中暂停程序并查看纹理内存时,我可以看到对象的深度立方体贴图。 – CCSeth