OSG透明度

转载 2016年06月01日 13:28:51

osg 打开透明度

  1. #include <osg/Node>  
  2. #include <osgViewer/Viewer>  
  3. #include <osgDB/ReadFile>  
  4. #include <osg/ShapeDrawable>  
  5. osg::ref_ptr<osg::Node>createBoxA()  
  6. {  
  7.   osg::ref_ptr<osg::Geode>gnode=new osg::Geode;  
  8.   osg::ref_ptr<osg::ShapeDrawable>sd=new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,-10,0),15,2,14));  
  9.   gnode->addDrawable(sd.get());  
  10.   
  11.   sd->setColor(osg::Vec4(0,0.,0.5,0.3f));  
  12.   gnode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);  
  13.   gnode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);  
  14.   return gnode;  
  15. }  
  16. osg::ref_ptr<osg::Node>createBoxB()  
  17. {  
  18.   osg::ref_ptr<osg::Geode>geode=new osg::Geode;  
  19.   
  20.   osg::ref_ptr<osg::ShapeDrawable>sd=new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,10,0),10,2,15));  
  21.   geode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);  
  22.   geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);  
  23.   geode->addDrawable(sd);  
  24.   sd->setColor(osg::Vec4(1,0,1.0,0.3));  
  25.   return geode;  
  26. }  
  27. int main(int argc, char *argv[])  
  28. {  
  29.   osg::ref_ptr<osgViewer::Viewer>viewer =new osgViewer::Viewer;  
  30.   osg::ref_ptr<osg::Group>root=new osg::Group;  
  31.   root->addChild(osgDB::readNodeFile("cow.osg"));  
  32.   root->addChild(createBoxB());  
  33.   root->addChild(createBoxA());  
  34.   viewer->setSceneData(root.get());  
  35.   return viewer->run();  

  1. }  


从外部导入的模型,有两种方法来设置透明,一种是材质,一种是混合

#include <Windows.h>
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgViewer/ViewerEventHandlers>
#include <osg/StateSet>
#include <osg/ShapeDrawable>
#include <osg/Material>
#include <osg/BlendColor>
#include <osg/BlendFunc>

int main(int argc,char** argv)
{
osgViewer::Viewer view;
osg::Group* root = new osg::Group();
root->addChild(osgDB::readNodeFile("cow.osg"));
//方法1
osg::StateSet* state = root->getOrCreateStateSet();
state->setMode(GL_BLEND,osg::StateAttribute::ON);
osg::ref_ptr<osg::Material> mat = new osg::Material;
//漫发射光
mat->setDiffuse(osg::Material::FRONT_AND_BACK,osg::Vec4(1.0,1.0,1.0,0.5));
//环境光
mat->setAmbient(osg::Material::FRONT_AND_BACK,osg::Vec4(1.0,1.0,1.0,0.5));
//设置材质的混合光颜色
mat->setTransparency(osg::Material::FRONT_AND_BACK,0.5);
state->setAttributeAndModes(mat,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);
state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
view.setSceneData(root);
view.run();
}

//方法2,使用混合函数来设置透明
int main(int argc,char** argv)
{
//方法2
osg::StateSet* state = root->getOrCreateStateSet();
//关闭灯光
state->setMode(GL_LIGHTING,osg::StateAttribute::OFF|osg::StateAttribute::PROTECTED);
//打开混合融合模式
state->setMode(GL_BLEND,osg::StateAttribute::ON);
state->setMode(GL_DEPTH_TEST,osg::StateAttribute::ON);
state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
//使用BlendFunc实现透明效果
osg::BlendColor* bc =new osg::BlendColor(osg::Vec4(1.0,1.0,1.0,0.0));
osg::BlendFunc*bf = new osg::BlendFunc();
state->setAttributeAndModes(bf,osg::StateAttribute::ON);
state->setAttributeAndModes(bc,osg::StateAttribute::ON);
bf->setSource(osg::BlendFunc::CONSTANT_ALPHA);
bf->setDestination(osg::BlendFunc::ONE_MINUS_CONSTANT_ALPHA);
bc->setConstantColor(osg::Vec4(1,1,1,0.5));
}

相关文章推荐

OSG对象设置透明

网格对象的透明设置: //方法1 osg::ref_ptr mat = new osg::Material; mat->setDiffuse(osg::Material::Front_AND_BACK...

osg::BlendFunc

osg::BlendFunc介绍      混合是什么呢?混合就是把两种颜色混在一起。具体一点,就是把某一像素位置原来的颜色和将要画上去的颜色,通过某种方式混在一起,从而实现特殊的效果。      假...

osg设置透明

自定义绘制模型可以使用透明的颜色,材质的混合光中中采用透明的颜色,在绘制模型是开启透明模式。 #include #include #include #include #include #i...

osg开启透明度

osg::StateSet* stateset = _geometryFeild->getOrCreateStateSet();   //Alpha混合开启    stateset->set...
  • hudfang
  • hudfang
  • 2015年07月02日 14:57
  • 942

OSG设置半透明显示

OSG设置半透明显示,需要设置显示颜色的alpha值小于1,且开启融合模式,设置渲染方式为透明方式。osg::Geometry* polyGeom = new osg::Geometry(); //颜...

osg中实现半透明效果

在为球贴图的基础上,实现模拟地球的透明展示。 是先前效果如下: 实现后效果如下: 实现代码如下,主要是在状态集中进行设置: osg::ref_ptrblendFunc = new os...

osg实现透明效果 正解

最近某个项目中要用OSG画部分半透明效果的形状,绘制可参考OSG自带例子:Examples osggeometry     但是半透明效果一直出不来,google一番之后 有位热心网友提供的...
  • hudfang
  • hudfang
  • 2015年05月13日 14:23
  • 801

osg 半透明遮挡实现

今天需要实现一个osg半透明遮挡场景,在网上查了好多帖子,都不好用,不是遮挡不对,就是所有物体全透明了。最后终于在google找到一篇英文帖子,解决了问题。 具体实现半透明效果的代码如下: osg...

osg设置透明

自定义绘制模型可以使用透明的颜色,材质的混合光中中采用透明的颜色,在绘制模型是开启透明模式。 #include #include #include #include #include...

OSG学习:用多通道(multiple passes)实现透明度

osgFX库提供了一个用于多通道渲染(multi-pass rendering)的框架。每个你想要渲染的子图都应该被添加到osgFX::Effect节点,多通道技术的定义和使用都可以在这个节点中完成。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG透明度
举报原因:
原因补充:

(最多只允许输入30个字)