OSG 개체 투명도 설정
6328 단어 OSG
[cpp] view plain copy
print ?
#include
#include
#include
#include
osg::ref_ptr<:node>createBoxA()
{
osg::ref_ptr<:geode>gnode=new osg::Geode;
osg::ref_ptr<:shapedrawable>sd=new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,-10,0),15,2,14));
gnode->addDrawable(sd.get());
sd->setColor(osg::Vec4(0,0.,0.5,0.3f));
gnode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
gnode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
return gnode;
}
osg::ref_ptr<:node>createBoxB()
{
osg::ref_ptr<:geode>geode=new osg::Geode;
osg::ref_ptr<:shapedrawable>sd=new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,10,0),10,2,15));
geode->getOrCreateStateSet()->setMode(GL_BLEND,osg::StateAttribute::ON);
geode->getOrCreateStateSet()->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
geode->addDrawable(sd);
sd->setColor(osg::Vec4(1,0,1.0,0.3));
return geode;
}
int main(int argc, char *argv[])
{
osg::ref_ptr<:viewer>viewer =new osgViewer::Viewer;
osg::ref_ptr<:group>root=new osg::Group;
root->addChild(osgDB::readNodeFile("cow.osg"));
root->addChild(createBoxB());
root->addChild(createBoxA());
viewer->setSceneData(root.get());
return viewer->run();
}
전재 주소:http://blog.csdn.net/zhuyingqingfen/article/details/8221637
외부에서 가져온 모델은 투명도를 설정하는 두 가지 방법이 있는데, 하나는 재료이고, 하나는 혼합이다.
#include
#include
#include
#include
#include
#include
#include
#include
#include
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<: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));
}
메쉬 객체의 투명도 설정:
//방법1
osg::ref_ptr<:material> mat = new osg::Material;
mat->setDiffuse(osg::Material::Front_AND_BACK,osg::Vec4f(1,1,1,0.5));
mat->setAmbient(osg::Material::Front_AND_BACK,osg::Vec4f(1,1,1,0.5));state->setAttributeAndModes(mat,osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);state->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);//반드시 이 말을 붙여야 한다. 그렇지 않으면 격자 내부의 대상이 보이지 않는다
//방법2, 이런 방법은 격자 효과가 좋지 않아 빛이 osg를 비추는 것을 닫을 수 없습니다::State Set* state = root->get Orcreate State Set().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,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에서 사용자 정의한 기본 형상을 사용하고 원추의 경우 투명한 효과와 메쉬 모델을 설정합니다.
먼저 원추를 생성합니다.
osg::ref_ptr<:geode> geode=new osg::Geode;
//
m_pCone=new osg::Cone;
m_pCone->setHeight(30);
m_pCone->setRadius(30);
osg::ref_ptr<:shapedrawable> shap=new osg::ShapeDrawable(m_pCone);
// 0.25 ,0 ,1
shap->setColor(osg::Vec4(0.4,0.8,0.4,0.25));
geode->addDrawable(shap);
다음은 투명 효과 및 메쉬 모델을 설정합니다.
//
osg::ref_ptr<:stateset> stateset=geode->getOrCreateStateSet();
stateset->setMode(GL_BLEND,osg::StateAttribute::ON);
stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
//
osg::ref_ptr<:polygonmode> polyMode=new osg::PolygonMode(osg::PolygonMode::FRONT_AND_BACK,osg::PolygonMode::LINE);
stateset->setAttribute(polyMode);
그리고 지오디라는 노드를 사용할 수 있습니다.
주의해야 할 것은 이 예에서 알 수 있듯이 OSG의 각 노드의 속성 설정은 이 노드와 관련된 osg::StateSet 대상에서 정의된 것이다. 이전에 테두리 모델을 설정하려고 할 때 osg::Cone와osg::ShapeDrawable에서 관련 함수를 찾았지만 찾지 못했다.OSG 미드필드 트리와 렌더링 트리에 대한 이해도 깊어졌다.
또 하나 주의해야 할 것은 투명 효과가 osg::Shape의set Color에만 불투명도를 설정하면 투명 효과를 볼 수 없을 것 같다는 것이다. osg::State Set에 관련 모델을 설정해야 한다. 이것은 OpenGL 상태기 모델에 의해 결정된 것이기 때문에 이곳의 설정을 잊지 말아야 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
osgAnimation 애니메이션 관리자이 클래스는 NodeCallback에서 계승하여 여러 개의 애니메이션 대상의 관리를 맡았다. (실질적으로 채널과 작용 대상을 링크로 진행했습니다.) 즉 채널에서 연산 결과를 저장하는 데 사용되는 Target 대상을 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.