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...
  • wang15061955806
  • wang15061955806
  • 2015年10月28日 11:28
  • 2061

OSG学习笔记22——设置物体透明,再恢复

设置物体透明,trans是透明度的设置,这里如果没有setRenderingHint()虽然看起来是透明的,但模型还是会遮挡其他模型。然后就是BLEND要打开,光照和深度测试要关掉。模型的材质也要事先...
  • u011310341
  • u011310341
  • 2017年03月29日 14:37
  • 635

OSG设置半透明显示

OSG设置半透明显示,需要设置显示颜色的alpha值小于1,且开启融合模式,设置渲染方式为透明方式。osg::Geometry* polyGeom = new osg::Geometry(); //颜...
  • snail_hunan
  • snail_hunan
  • 2017年04月12日 21:57
  • 550

android透明在 4.0 4.1 下面为黑色解决办法

有时候明明设置了 @color/full_transparent 或者用系统的@android:color/transparent 都会出现黑色情况, 原理其实是很简单的,因为你使用透明的时候,正常...
  • fff2666
  • fff2666
  • 2015年11月18日 14:13
  • 418

OpenGL: 透明

代码如下:#include #pragma comment(lib, "glut32.lib") void Initialization() { glClearColor(0.0f, 0.0f,...
  • Augusdi
  • Augusdi
  • 2014年03月05日 09:34
  • 5963

osg中实现半透明效果

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

osg开启透明度

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

Qt处理图片背景为透明色

Qt界面开发程序中,需要将背景为白色的图片改为透明色。 这里,贴出处理代码,仅供参考学习: void ConvertImageToTransparent(QPixmap qPixmap) { ...
  • u013015629
  • u013015629
  • 2016年10月09日 08:58
  • 1874

主菜单

类FMainMenu:实现效果:相关代码:TSharedRef&lt;SWidget&gt; FMainMenu::MakeMainMenu(const TSharedPtr&...
  • wenshuifuping
  • wenshuifuping
  • 2018年02月08日 15:10
  • 13

OSG 透明度

osg 打开透明度 #include #include #include #include osg::ref_ptrcreateBoxA() { osg::ref_ptrgnode=...
  • zhuyingqingfen
  • zhuyingqingfen
  • 2012年11月25日 10:46
  • 2470
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSG透明度
举报原因:
原因补充:

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