OSG多光源及簡單材質設置

osg多光源光照

osg::Light

OSG將OpenGL中的glLight()作了一個light狀態的類封裝,用於保存燈光的模式與屬性參數信息。osg::Light類派生自osg::StateAttribute類,繼承了對模式與屬性參數信息的操作接口。

osg::LightSource

osg::LightSource 類直接繼承自 osg::Group.作爲一個燈光管理類,繼承了osg::Group類的管理節點的接口;將燈光作爲一個節點可以加入到場景圖中進行渲染。

場景中使用光源的步驟

  • 指定場景中模型法向;
  • 允許光照並設置光照狀態;
  • 指定光源屬性並關聯到場景圖形

簡單的雙光源示例

osg::ref_ptr<osg::Group> createLight(osg::ref_ptr<osg::Node> node)
{
	osg::ref_ptr<osg::Group> lightRoot = new osg::Group();
	lightRoot->addChild(node);
 
	//開啓光照
	osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();
	stateset = lightRoot->getOrCreateStateSet();
	stateset->setMode(GL_LIGHTING , osg::StateAttribute::ON);
	stateset->setMode(GL_LIGHT0 , osg::StateAttribute::ON);//允許GL_LIGHT0光照
	stateset->setMode(GL_LIGHT1 , osg::StateAttribute::ON);//允許GL_LIGHT1光照
	
	//創建兩個個Light對象
	osg::ref_ptr<osg::Light> light = new osg::Light();
	osg::ref_ptr<osg::Light> light1 = new osg::Light();
	//開啓光照
	light->setLightNum(0);
	light1->setLightNum(1);//0對應GL_LIGHT0,1對應GL_LIGHT1,默認情況下爲GL_LIGHT0
	//設置方向
	//light->setDirection(osg::Vec3(0.0f , 0.0f , -1.0f));
	//設置位置 最後一個參數1是點光源,0是平行光
	light->setPosition(osg::Vec4(1.0f, 1.0f, 1.0f, 0.0f));//太陽光
	light1->setPosition(osg::Vec4(100.f, 100.f, 800.f, 1.0f));
 
	
	//設置光源顏色
	light->setAmbient(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
	light1->setAmbient(osg::Vec4(0.3f, 0.3f, 0.5f, 1.0f));
	//設置散射光的顏色
	light->setDiffuse(osg::Vec4(1.0f, 1.0f, 1.0f, 1.0f));
	light1->setDiffuse(osg::Vec4(0.75f, 0.75f, 0.75f, 1.0f));
	//鏡面反射顏色
	light->setSpecular(osg::Vec4d( 0.8f, 0.8f, 0.8f, 1.0f ));
	light1->setSpecular(osg::Vec4d( 0.8f, 0.8f, 0.8f, 1.0f ));
 

	//設置恆衰減指數(可使用默認參數)
	light->setConstantAttenuation(1.f);
	light1->setConstantAttenuation(1.f);
	//設置線性衰減指數
	light->setLinearAttenuation(0.f);
	light1->setLinearAttenuation(0.f);
	//light->setLinearAttenuation(0.f);
	//設置二次方衰減指數
	light->setQuadraticAttenuation(0.f);
	light1->setQuadraticAttenuation(0.f);
	//stateset->setAttribute(light,osg::StateAttribute::OFF);
 
	//light->setQuadraticAttenuation(0.f);
 
	//創建光源 
	osg::ref_ptr<osg::LightSource> lightSource = new osg::LightSource();
	osg::ref_ptr<osg::LightSource> lightSource1 = new osg::LightSource();
	lightSource->setLight(light.get());
	lightSource1->setLight(light1.get());
	lightRoot->addChild(lightSource.get());
	lightRoot->addChild(lightSource1.get());
 
	return lightRoot.get();
 
}

模型簡單材質設置

在場景中設置節點的材質屬性,首先要創建一個osg::Material對象,然後設置顏色和其他參數。

osg::Material *material = new osg::Material;
material->setDiffuse(osg::Material::FRONT, osg::Vec4(0.486, 0.486, 0.811, 1.0));
material->setAmbient(osg::Material::FRONT, osg::Vec4(0.486, 0.486, 0.811, 1.0));
material->setShininess(osg::Material::FRONT, 90.0);
geode->getOrCreateStateSet()->setAttribute(material);

這裏就是設置了環境光顏色,以及鏡面光顏色,以及前面的shininess,值越大亮點越小,越亮。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章