查看: 2585|回复: 14

关于osgShadow的问题

[复制链接]

该用户从未签到

发表于 2010-12-8 18:33:12 | 显示全部楼层 |阅读模式
我使用了osgShadow里面的ShadowMap来为场景产生阴影,遇到了两个问题:
1、物体背光的一面怎么那么黑?这个效果显然不是可以接受的效果。osg的范例程序,osgShadow也是如此。那么是否osg没有办法解决这个问题?

2、我在程序中想动态的去除阴影。这里我调用ShadowedScene::setShadowTechnique(ShadowTechnique* technique)函数,传入NULL参数。发现阴影的确没有了。但是场景也恢复不到原本没有阴影的状况,表现出来的效果,就是物体背光的一面还是那么的黑,只是拖出来的影子没有了而已。这个问题能否得到解决?

该用户从未签到

 楼主| 发表于 2010-12-8 18:41:38 | 显示全部楼层
我场景的根节点采用的是osgShadow::ShadowedScene类型
我附带了三个截图:
第一个截图是没有使用阴影的初始情况。我在初始情况下,没有调用ShadowedScene::setShadowTechnique,即没有给它阴影方式,因此得到的效果就是没有任何阴影的样子。这是我想要的效果。
第二个截图,是我在程序运行过程中,调用了ShadowedScene::setShadowTechnique,给它设置了一个ShadowMap对象过去,它产生了阴影,正常地投射到地面上了。但是这些建筑物的背光面怎么那么黑呢?(我的光源在右边,为无穷远处的白色光源)
第三个截图,是我在得到第二个截图之后,再次调用ShadowedScene::setShadowTechnique,以参数NULL传入。可以看到地面上的阴影不见了。但是建筑物的背光面还是那么的黑,并没有回到截图一的效果。

有人能够说说这其中的理由么?
我程序中有如下代码企图用来切换阴影的存在:
   osgShadow::ShadowTechnique *pTechnique = m_pShadowedScene->getShadowTechnique();
   if(pTechnique)
   {
    m_pShadowedScene->cleanSceneGraph();
    m_pShadowedScene->dirty();
    m_pShadowedScene->setShadowTechnique(NULL);
   }
   else
   {
    osg::ref_ptr<osgShadow::ShadowMap> pShadowMap = new osgShadow::ShadowMap;
    pShadowMap->setTextureSize(osg::Vec2s(512, 512));
    m_pShadowedScene->setShadowTechnique(pShadowMap.get());
   }
上面的代码,是用来切换是否存在阴影的。
1.JPG
2.JPG
3.JPG

该用户从未签到

发表于 2010-12-9 08:40:06 | 显示全部楼层
一个常识是:目前没有任何一种实时阴影方案可以完美地模拟大规模场景中的实时光影效果,无论OSG还是别的什么都不可能。

ShadowMap是很古老的技术实现,效果很差,不过本身不存在什么问题。您的问题恐怕只是您的场景光源布设不合理所致的,一般来说三个光源成主、背、侧布局是比较合适的,其中主光源投射阴影

更新的GPU阴影技术可以通过LightSpacePerspectiveShadowMap来完成,效果非常之好。但是再强调一次——目前没有任何一种阴影技术可以无前提地应用于任意大规模场景中

该用户从未签到

发表于 2010-12-9 08:41:58 | 显示全部楼层
此外我认为您的切换代码有待商榷;您是否尝试过直接添加阴影?是否有效果?

该用户从未签到

 楼主| 发表于 2010-12-9 09:51:31 | 显示全部楼层
我昨天晚上又修改了代码,使用Switch节点,下面挂接两个子节点,分别是普通的Group和ShadowScene类型。
通过切换这个Switch节点,试图来关闭阴影。不过仍然没有成功,阴影关闭之后,建筑的背面仍然非常暗,如一楼贴的图片那样,没有任何改观。

该用户从未签到

发表于 2010-12-9 10:37:15 | 显示全部楼层
关闭阴影的话,有没有试过把整个场景的nodemask set to "ReceivesShadowTraversalMask"?

阴影的颜色问题除了array所说的外,还有个简单的办法就是可以通过载入修改过的shadow  map的frag shader的办法,来改变阴影颜色。如果你使用shadowmap的话,需要先
  1. clearShaderList()
复制代码
,再添加你修改过的shadow map 的vert and frag shader。shadowmap本身的shader在osg源文件里有。

该用户从未签到

 楼主| 发表于 2010-12-10 10:19:04 | 显示全部楼层
已经清除了ShadowMap里面的ShaderList,问题依旧。

该用户从未签到

 楼主| 发表于 2010-12-10 10:21:24 | 显示全部楼层
问题不光如此,我将ShadowedScene的ShadowTechnique设置为NULL,然后清除了ShaderList,然后将ShadowedScene下面的所有子节点全部删除(我的根节点就是ShadowedScene),重新从文件读取之后再挂接上去,问题依旧。

该用户从未签到

发表于 2010-12-10 10:31:21 | 显示全部楼层
可能我没有表达清楚我的意思。clearShaderList() 之后还需要载入如你自己的shader (addShader() ) ,来达到修改阴影颜色的目的。

另外你第一张图的光源在哪里?跟之后两张的位置一样吗?

该用户从未签到

 楼主| 发表于 2010-12-10 16:31:44 | 显示全部楼层
本帖最后由 yin_savage 于 2010-12-10 16:33 编辑
可能我没有表达清楚我的意思。clearShaderList() 之后还需要载入如你自己的shader (addShader() ) ,来达到修改阴影颜色的目的。

另外你第一张图的光源在哪里?跟之后两张的位置一样吗?
aya_daxiang 发表于 2010-12-10 10:31


我的三张截图,光源的位置都是一样的,没有修改光源的任何属性。
另外,我自己没有写Shader,我期望的只是去掉ShadowMap之后,能够恢复到没有使用影子时的效果。可是竟然做不到。

另外,我使用了LightSpacePerspectiveShadowMap,的确效果要好许多,按照先前的思路,的确可以非常完美地切换阴影的存在。不过,它有一个巨大的问题我不能接受:场景中的物体很少时,它能够正确的投射阴影,当场景中物体多起来的时候(也就百来个物体),它投射的阴影都乱了,不该有阴影的地方也有了阴影。

该用户从未签到

发表于 2010-12-10 17:01:28 | 显示全部楼层
这正如我之前所说:目前没有任何一种实时阴影方案可以完美地模拟大规模场景中的实时光影效果,无论OSG还是别的什么都不可能。

该用户从未签到

发表于 2010-12-10 17:41:22 | 显示全部楼层
我的三张截图,光源的位置都是一样的,没有修改光源的任何属性。

yin_savage 发表于 2010-12-10 16:31


这就奇怪了,我觉得应该是没有影响的啊..当然我没有做过类似的事情,所以可能我的猜测不一定正确。很抱歉没办法帮到你了。
忽然想到会不会跟你的模型有关系呢?用lipsm的时候试以下,
  1. msm->setShadowTextureCoordIndex( 3);
  2. msm->setShadowTextureUnit( 3);
复制代码

看看有没有用呢?

该用户从未签到

 楼主| 发表于 2010-12-10 19:30:15 | 显示全部楼层
呵呵,回楼上,问题已经解决。
    pShadowMap->setShadowTextureCoordIndex( 3);
    pShadowMap->setShadowTextureUnit( 3);
    pShadowMap->setBaseTextureCoordIndex( 0);
    pShadowMap->setBaseTextureUnit( 0);

理由我也相通了。ShadowMap是通过多重纹理的方式来投射影子的。感谢感谢!

该用户从未签到

发表于 2010-12-13 10:37:22 | 显示全部楼层
mark学习

该用户从未签到

发表于 2013-9-30 15:29:07 | 显示全部楼层
mark学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表