查看: 3028|回复: 10

阴影<续>

[复制链接]

该用户从未签到

发表于 2009-1-4 18:02:17 | 显示全部楼层 |阅读模式
用osgshadow::shadowtextrue貌似正确了,但是又有新问题了,我想让前面的建筑的阴影打到后面的建筑上,设置所有建筑的nodemask为recieve|cast,结果和单设置cast是一样的效果
阴影.jpg

该用户从未签到

 楼主| 发表于 2009-1-4 18:02:54 | 显示全部楼层
阴影的颜色太黑了,如何修改?

该用户从未签到

发表于 2009-1-4 19:07:46 | 显示全部楼层
其实我一直没有搞懂为什么官方例子在您的计算机上,预编译版本和您自己生成的版本运行会有不同的结果。有一种可能是您的LIB静态库和DLL动态库的版本不一样,以至出现无法预期的错误;另一种可能是硬件问题,不过您说过预编译版本(您下载的安装包)是可以的。

如果不涉密您也不介意的话,能否上传一些可以反映问题的代码文件?或者您选择其它可用的计算机再试一下,看一看在别的环境下有没有问题。

ShadowMap应当说是目前最稳定的阴影算法,内部使用GLSL着色代码,基于GPU Gems所提及的算法。

该用户从未签到

 楼主| 发表于 2009-1-5 09:18:21 | 显示全部楼层
相关代码如下,我截取了其中一部分,与其无关的建模省略了,建模是在cad中建模,然后直接读取dwg文件生成的模型
osg::Group* CGeDataBase:sg_root()
{
       
        osg::Group* grp = new osg::Group;
       
        int i;
       
       

        for(i = 0 ; i < m_Entitys.GetSize();i++)
        {
                 CEntityBase* pEntity =  m_Entitys;
                       

                osg::ref_ptr<osg::Geode> geod =  pEntity->CreateGeode();
                geod->setNodeMask(Ge::_CastsShadowTraversalMask | Ge::_ReceivesShadowTraversalMask);
                grp->addChild(geod.get());
        }
        //grp->setNodeMask(Ge::_CastsShadowTraversalMask | Ge::_ReceivesShadowTraversalMask);


        osg::ref_ptr<osg::Geode> geodPlane = CreatePlan(p1,p2);
        geodPlane->setNodeMask(Ge::_ReceivesShadowTraversalMask);
       
        osgShadow::ShadowedScene * shadow = new osgShadow::ShadowedScene;
        shadow->setCastsShadowTraversalMask(Ge::_CastsShadowTraversalMask);
        shadow->setReceivesShadowTraversalMask(Ge::_ReceivesShadowTraversalMask);
        shadow->setShadowTechnique(new osgShadow::ShadowTexture);
        //shadow->setShadowTechnique(new osgShadow::ShadowMap);

        shadow->addChild(geodPlane.get());
        shadow->addChild(grp);
        return shadow;

}


//主场景
CGeDataBase * dbase = new CGeDataBase();
....//增加实体,与用户交互的一些操作比较长

//得到当前数据库场景
osg::node * node = dbase->osg_root()

//显示场景
osg::ref_ptr<osg::Group>  grp = new osg::Group;
        osg::ref_ptr<osg:ightSource> ls = new osg::LightSource;
        //设置方向性光源,光源方向向量(1000,-1000,1000)
        ls->getLight()->setPosition(osg::Vec4(1000,-1000,1000,0.0));
        ls->getLight()->setAmbient(osg::Vec4(0.2,0.2,0.2,1.0));
        ls->getLight()->setDiffuse(osg::Vec4(0.8,0.8,0.8,1.0));
       
        //sm->setLight(ls.get());

        grp->addChild(ls.get());
        grp->addChild(node);
       

        if (m_root == NULL)
        {
                m_root = new osg::Group;
                m_node = grp.get();
                m_root->addChild(grp.get());
               

        }
        //调用view,显示场景,省略

以下是我相关的文件
release.rar 是我编译的exe和原安装包的exe,使用的是osg-2.4
osgsrc.rar是我编译官方例子用的工程
谢谢斑竹,麻烦帮看下

[ 本帖最后由 xxxx7000 于 2009-1-5 09:25 编辑 ]

Release.rar

60.33 KB, 下载次数: 144, 下载积分: 威望 1

我编译的exe和原exe

osgsrc.rar

19.46 KB, 下载次数: 147, 下载积分: 威望 1

我新建的工程编译原例子

该用户从未签到

发表于 2009-1-5 09:33:07 | 显示全部楼层
您的osgsrc例子程序在我的Intel CPU Core Quad 6600,nVIDIA 9600GT,Windows XP SP3,VS2008,OSG 2.7.8上编译和运行通过,执行效果没有问题。我想和您的硬件或者显卡驱动都有关系?
至于您生成的exe文件,因为您使用了Version-DLL标识头(osg35-*之类的),所以在我这里不能运行。

该用户从未签到

 楼主| 发表于 2009-1-5 09:52:59 | 显示全部楼层
回复真快!
谢谢!
我试了,osg2.6也是一样,我更新下显卡驱动看看,真是奇怪啊,如果能解决,我发布解决办法,如果在你计算机运行正常,估计是我计算机显卡问题了

该用户从未签到

 楼主| 发表于 2009-1-5 09:57:36 | 显示全部楼层
最奇怪的是,原安装包的程序没有问题,我重新编译就有问题

该用户从未签到

 楼主| 发表于 2009-1-5 09:58:03 | 显示全部楼层
如果说显卡驱动有问题,那原安装包也会有问题啊

该用户从未签到

 楼主| 发表于 2009-1-5 16:44:33 | 显示全部楼层
我把程序放到别的计算机运行正常了,看来是我计算机显卡问题
但还留下疑问:
为什么osg安装包中编译过的exe显示正确

该用户从未签到

发表于 2009-1-5 17:55:17 | 显示全部楼层
这个我好像也没什么头绪,不知有没有在行的朋友

该用户从未签到

发表于 2012-8-1 14:30:32 | 显示全部楼层
“我想让前面的建筑的阴影打到后面的建筑上,设置所有建筑的nodemask为recieve|cast,结果和单设置cast是一样的效果”
请问这个问题你解决了吗?我也遇到同样的问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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