查看: 2413|回复: 3

ShadowMap下可以使用纹理贴图么?

[复制链接]

该用户从未签到

发表于 2009-6-16 11:02:40 | 显示全部楼层 |阅读模式
我创建了一个有阴影的场景shadowscene,使用的事shadow map算法:       
        osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;
        shadowedScene->setShadowTechnique(sm.get());
        viewer.setSceneData(shadowedScene.get());
在这个场景里面添加一个节点,cow.osg 并对他进行纹理贴图,但是失败了:
ShadowMap.JPG
但是如果我把这一句代码去掉:
//shadowedScene->setShadowTechnique(sm.get());
就可以对cow.osg使用纹理贴图:
noShadowMap.JPG

请问有人知道为什么shadowmap下面不可以使用纹理贴图呢?是我做错什么了么?

这是我的程序:
#include <osg/Texture3D>
#include <osgShadow/ShadowedScene>
#include <osgShadow/ShadowMap>
#include <osg/Node>
#include <osg/Group>
#include <osg/PositionAttitudeTransform>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>
#include <osg/StateAttribute>
#include <osgDB/ReadFile>

const int ReceivesShadowTraversalMask = 0x1;
const int CastsShadowTraversalMask = 0x2;

int main(int argc,char* argv[])
{
        osg::ref_ptr<osgShadow::ShadowedScene> shadowedScene = new osgShadow::ShadowedScene;
        osg::ref_ptr<osg::Image> image = new osg::Image;
        osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
       
        image = osgDB::readImageFile("tex.tga");
        if (image.valid())
        {               
                osg::Texture3D* texture = new osg::Texture3D;
                texture->setImage(image.get());
                texture->setDataVariance(osg::Object:YNAMIC);
                stateset->setTextureAttributeAndModes(0,texture,osg::StateAttribute::ON);
        }

        osg::ref_ptr<osg::Node> Cntr = osgDB::readNodeFile("cow.osg");
        osg::ref_ptr<osg:ositionAttitudeTransform> cont = new osg::PositionAttitudeTransform;
        Cntr->setStateSet(stateset.get());
        if(Cntr.valid())
        {
                cont->addChild(Cntr.get());
                shadowedScene->addChild(cont.get());
        }

        osgViewer::Viewer viewer;
        shadowedScene->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
        shadowedScene->setCastsShadowTraversalMask(CastsShadowTraversalMask);
        osg::ref_ptr<osgShadow::ShadowMap> sm = new osgShadow::ShadowMap;
        shadowedScene->setShadowTechnique(sm.get());
        viewer.setSceneData(shadowedScene.get());
       
        viewer.setCameraManipulator(new osgGA::TrackballManipulator());       
        viewer.realize();

        osgViewer::Viewer::Windows windows;
    viewer.getWindows(windows);
    for(osgViewer::Viewer::Windows::iterator itr = windows.begin();
        itr != windows.end();
        ++itr)
    {
        (*itr)->useCursor(false);
    }
        viewer.run();
}

该用户从未签到

发表于 2009-6-16 11:31:34 | 显示全部楼层
可以考虑设置一下ShadowMap的setTextureUnit()函数,把阴影的纹理单元和贴图的纹理单元区分开

该用户从未签到

 楼主| 发表于 2009-6-16 15:04:14 | 显示全部楼层
谢谢array,不过我试了下:
sm->setTextureUnit(1);
但结果还是一样的。

该用户从未签到

 楼主| 发表于 2009-6-16 17:16:04 | 显示全部楼层
找到问题了:
Texture3D应该是2D,
->setTextureAttributeAndModes(0,tex,osg::StateAttribute::OVERRIDE)而不是,osg::StateAttribute::ON

之前以为纹理是openGL fix function pipeline,会合shader起冲突,看来是我想错了。
还是谢谢大家了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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