查看: 3973|回复: 5

天空盒的问题

[复制链接]

该用户从未签到

发表于 2010-5-6 11:09:55 | 显示全部楼层 |阅读模式
请教各位,我的程序中添加了天空盒,但是在某个角度观察加入场景的模型时,会出现下列情况之一:1.模型有开灯关灯的效果(场景和模型的灯光都已经关闭)2.天空盒变成黑色3.模型错位。如果将模型中的颜色数组(colorArray)去掉,则不会出现这样的情况。
不知是否有遇到类似情况的。
谢谢解答!

该用户从未签到

发表于 2010-5-6 12:35:19 | 显示全部楼层
我无法知道您的天空盒是如何实现的,因此也就无法判断您的错误可能的原因。不过由于OpenGL状态机的机制,setColorArray的确有可能影响到其它的节点,您可以给天空盒也设置一个简单的ColorArray

该用户从未签到

 楼主| 发表于 2010-5-6 17:13:53 | 显示全部楼层
下面是我创建天空盒的代码:

osg::Node* CSkyBox::createSkyBox()
{
  osg::StateSet* stateset = new osg::StateSet();
//设置纹理为替代模式
    osg::TexEnv* te = new osg::TexEnv;
    te->setMode(osg::TexEnv::REPLACE);
    stateset->setTextureAttributeAndModes(0, te, osg::StateAttribute::ON);
   
//立方体纹理
    osg::TexGen *tg = new osg::TexGen;
    tg->setMode(osg::TexGen::NORMAL_MAP);
    stateset->setTextureAttributeAndModes(0, tg, osg::StateAttribute::ON);
    //设置纹理矩阵
    osg::TexMat *tm = new osg::TexMat;
    stateset->setTextureAttribute(0, tm);
//读纹理图片
    osg::TextureCubeMap* skymap = readCubeMap();
if (skymap)
{
  stateset->setDataVariance(osg::Object:YNAMIC);
  osg::ref_ptr<osg:rogram>  skyProgram = new osg::Program;
  osg::Shader* vertex_shader = new osg::Shader(osg::Shader::VERTEX,skybox_vert);
  skyProgram->addShader(vertex_shader);
  osg::Shader* fragment_shader = new osg::Shader(osg::Shader::FRAGMENT,skybox_frag);
        skyProgram->addShader(fragment_shader);
  stateset->addUniform(new osg::Uniform("sun_vec", osg::Vec3d(0.0,0.0,1.0)));
  stateset->addUniform(new osg::Uniform("sun_shininess", 240.f));
  stateset->addUniform(new osg::Uniform("sun_strength",  6.0f));
        stateset->addUniform(new osg::Uniform("sky",0));
  stateset->setAttributeAndModes(skyProgram);
  stateset->setTextureAttribute(0,skymap);
}
    //stateset->setTextureAttributeAndModes(0, skymap, osg::StateAttribute::ON);
   
    stateset->setMode( GL_LIGHTING, osg::StateAttribute::OFF );
    stateset->setMode( GL_CULL_FACE, osg::StateAttribute::OFF );
    // clear the depth to the far plane.
    osg::Depth* depth = new osg::Depth;
    depth->setFunction(osg::Depth::ALWAYS);
    depth->setRange(1.0,1.0);   
    stateset->setAttributeAndModes(depth, osg::StateAttribute::ON );
//设置绘制顺序,天空盒子优先
stateset->setRenderBinDetails(-1,"RenderBin");

osg::Drawable* drawable = new osg::ShapeDrawable(new osg::Sphere(m_centre,m_r));
   
drawable->setName("skyboxGeom");
    osg::Geode* geode = new osg::Geode;
    geode->setCullingActive(false);
    geode->setStateSet( stateset );
    geode->addDrawable(drawable);
    osg::Transform* transform = new MoveEarthySkyWithEyePointTransform;
    transform->setCullingActive(false);
    transform->addChild(geode);
     osg::ClearNode* clearNode = new osg::ClearNode;
    clearNode->setCullCallback(new TexMatCallback(*tm));//更新纹理矩阵
    clearNode->addChild(transform);
    return clearNode;
}

请帮忙看看是否有错误。谢谢。
我把这个天空盒节点导出为osg文件,在ShapeDrawable节点下有color 1 1 1 1 的代码,请问这个color可以去掉吗?怎么去掉。
麻烦了。

该用户从未签到

发表于 2010-5-6 23:25:07 | 显示全部楼层
可以设置状态属性,关闭或者开启光照~~~~~~~天空盒的例子请参看osgvertexprogram~~~~~~~

该用户从未签到

发表于 2011-6-1 16:40:45 | 显示全部楼层
osgvertexprogram例子中的天空盒子是将天空和地形连在一起了的么?我现在需要分开设置天空和地形,这个该怎么办好

如果要该这个例子来实现,该改哪些地方,求解!

该用户从未签到

发表于 2011-6-3 07:43:40 | 显示全部楼层
您还是好好理解一下osgvertexprogram这个程序中的代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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