查看: 2964|回复: 7

【求助】请教一下关于osgprerendercubemap这个例子里的问题

[复制链接]

该用户从未签到

发表于 2008-10-4 09:19:15 | 显示全部楼层 |阅读模式
这个例子是做实时反射的,其中最主要的函数是这个,我在添加reflector是自己的一个模型,但是模型原来的纹理全不见了,请问怎么解决这个问题?

osg::Group* createShadowedScene(osg::Node* reflectedSubgraph, osg::NodePath reflectorNodePath,
                                                                unsigned int unit, const osg::Vec4& clearColor,
                                                                unsigned tex_width, unsigned tex_height,
                                                                osg::Camera::RenderTargetImplementation renderImplementation)
{

    osg::Group* group = new osg::Group;
   
    osg::TextureCubeMap* texture = new osg::TextureCubeMap;
    texture->setTextureSize(tex_width, tex_height);

    texture->setInternalFormat(GL_RGB);
    texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
    texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
    texture->setWrap(osg::Texture::WRAP_R, osg::Texture::CLAMP_TO_EDGE);
    texture->setFilter(osg::TextureCubeMap::MIN_FILTER,osg::TextureCubeMap:INEAR);
    texture->setFilter(osg::TextureCubeMap::MAG_FILTER,osg::TextureCubeMap::LINEAR);
   
    // set up the render to texture cameras.
    UpdateCameraAndTexGenCallback::CameraList Cameras;

    for(unsigned int i=0; i<6; ++i)
    {
        // create the camera
        osg::Camera* camera = new osg::Camera;

        camera->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        camera->setClearColor(clearColor);

        // set viewport
        camera->setViewport(0,0,tex_width,tex_height);

        // set the camera to render before the main camera.
        camera->setRenderOrder(osg::Camera:RE_RENDER);

        // tell the camera to use OpenGL frame buffer object where supported.
        camera->setRenderTargetImplementation(renderImplementation);

        // attach the texture and use it as the color buffer.
        camera->attach(osg::Camera::COLOR_BUFFER, texture, 0, i);

        // add subgraph to render
        camera->addChild(reflectedSubgraph);
        
        group->addChild(camera);
        
        Cameras.push_back(camera);
    }
   
    // create the texgen node to project the tex coords onto the subgraph
    osg::TexGenNode* texgenNode = new osg::TexGenNode;
    texgenNode->getTexGen()->setMode(osg::TexGen::REFLECTION_MAP);
    texgenNode->setTextureUnit(unit);
    group->addChild(texgenNode);

    // set the reflected subgraph so that it uses the texture and tex gen settings.   
    {
                  ////////////添加reflector//////////
                //osg::Node* reflectorNode = reflectorNodePath.front();
                //group->addChild(reflectorNode);

                Geode* geode_1 = new Geode;
                const float radius = 0.8f;
                ref_ptr<TessellationHints> hints1 = new TessellationHints;
                hints1->setDetailRatio(2.0f);
                ShapeDrawable* shape1 = new ShapeDrawable(new Sphere(Vec3(0.0f, 0.0f, 0.0f), radius * 1.5f), hints1.get());
                shape1->setColor(Vec4(0.8f, 0.8f, 0.8f, 1.0f));
                geode_1->addDrawable(shape1);
                group->addChild(geode_1);


                osg::StateSet* stateset = geode_1->getOrCreateStateSet();
        stateset->setTextureAttributeAndModes(unit,texture,osg::StateAttribute::ON);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_S,osg::StateAttribute::ON);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_T,osg::StateAttribute::ON);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_R,osg::StateAttribute::ON);
        stateset->setTextureMode(unit,GL_TEXTURE_GEN_Q,osg::StateAttribute::ON);

        osg::TexMat* texmat = new osg::TexMat;
        stateset->setTextureAttributeAndModes(unit,texmat,osg::StateAttribute::ON);
        
        geode_1->setCullCallback(new TexMatCullCallback(texmat));
    }
   
    // add the reflector scene to draw just as normal
    group->addChild(reflectedSubgraph);
   
    // set an update callback to keep moving the camera and tex gen in the right direction.
    group->setUpdateCallback(new UpdateCameraAndTexGenCallback(reflectorNodePath, Cameras));

    return group;
}

效果如下图

[ 本帖最后由 zhchlll 于 2008-10-4 09:30 编辑 ]
未命名1.JPG

该用户从未签到

发表于 2008-10-4 11:04:35 | 显示全部楼层
  1. osg::StateSet* stateset = geode_1->getOrCreateStateSet();
  2. stateset->setTextureAttributeAndModes(unit,texture,osg::StateAttribute::ON);
  3. stateset->setTextureMode(unit,GL_TEXTURE_GEN_S,osg::StateAttribute::ON);
  4. stateset->setTextureMode(unit,GL_TEXTURE_GEN_T,osg::StateAttribute::ON);
  5. stateset->setTextureMode(unit,GL_TEXTURE_GEN_R,osg::StateAttribute::ON);
  6. stateset->setTextureMode(unit,GL_TEXTURE_GEN_Q,osg::StateAttribute::ON);
复制代码
注意这里把计算得到的阴影纹理关联到unit指定的纹理单元上。缺省时unit=0,自然会把对象自己的纹理覆盖掉了。
可以设置unit为1或者不冲突的纹理单元,可以看看createShadowedScene函数的传入参数

该用户从未签到

 楼主| 发表于 2008-10-4 15:32:45 | 显示全部楼层
谢谢array大哥了,自己不懂openGL的东西,呵呵

该用户从未签到

 楼主| 发表于 2008-10-5 10:29:51 | 显示全部楼层
再问一下,这个实际上是不是多重纹理,如果我想使原来的纹理为主色调,应该怎么调整呢?

该用户从未签到

发表于 2008-10-5 11:59:53 | 显示全部楼层
调整纹理权重的话,可以考虑用osgFX::MultiTextureControl

该用户从未签到

 楼主| 发表于 2008-10-5 16:46:59 | 显示全部楼层
我如果添加一个环境纹理的话
osg::TexEnv* texenv = new osg::TexEnv;
texenv->setMode(osg::TexEnv::BLEND);
texenv->setColor(osg::Vec4(0.6f,0.6f,0.6f,0.1f));
然后在stateset中设置一下
stateset->setTextureAttribute(unit,texenv);

好像就有效果,这个是个什么原理,array大哥你能解释一下么?


先试试texconturol的。

[ 本帖最后由 zhchlll 于 2008-10-5 16:48 编辑 ]

该用户从未签到

发表于 2008-10-5 17:58:24 | 显示全部楼层
这个其实就是glTexEnv的封装
setColor指定了一种颜色,而GL_BLEND指定将纹理值与这个颜色值进行混合

该用户从未签到

 楼主| 发表于 2008-10-5 18:56:41 | 显示全部楼层
谢谢了,查了一下openGL的书,稍微明白一些了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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