OSG着色问题

Fivest_wu 2017-04-07 10:53:31
用osg显示多个三角形,每个三角形的颜色不一样且已知,运行却显示全白,求解。
颜色数组为整形,数值在0~225之间

osgViewer::Viewer viewer;
osg::Group * root = new osg::Group();
osg::ref_ptr<osg::Geode> geode = new osg::Geode;

while(100)
{
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

//定义点
osg::ref_ptr<osg::Vec3Array> v = new osg::Vec3Array;
v->push_back(osg::Vec3(V[0][0], V[0][1], V[0][2]));
v->push_back(osg::Vec3(V[1][0], V[1][1], V[1][2]));
v->push_back(osg::Vec3(V[2][0], V[2][1], V[2][2]));

//定义颜色
osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
geom->setColorBinding(osg::Geometry::BIND_PER_VERTEX);
c->push_back(osg::Vec4(color[0][0], color[0][1], color[0][2], 255));
c->push_back(osg::Vec4(color[1][0], color[1][1], color[1][2], 255));
c->push_back(osg::Vec4(color[2][0], color[2][1], color[2][2], 255));

//******显示面片
geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLES, 0, 3));

geom->setVertexArray(v.get());
geom->setColorArray(c.get());
geode->addDrawable(geom.get());
}

root->addChild(geode.get());

viewer.setSceneData(root);
viewer.getCamera()->setClearColor(osg::Vec4f(1,1,1,1));
viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
viewer.addEventHandler(new osgViewer::WindowSizeHandler);
viewer.addEventHandler(new osgViewer::StatsHandler);
viewer.setUpViewInWindow(10,30,800,600);
viewer.realize();
viewer.run();
...全文
2261 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
cadinfo 2018-05-04
  • 打赏
  • 举报
回复
顶点色, 纹理色,材质色。 三色的区别挺大,尤其在固定管线中。 最简单的例子,在固定管线中,你把光打开后,顶点色失去作用,其最终颜色去决定于材质色+纹理色+光色。 在固定管线中,如果关闭光,那材质色失去作用(没有光, 光向量×材质法向量 也就没得乘了 ),纹理色还是去作用的。 如果是可编程管线,那就无所谓了,你自己可以控制算法。 _____________________________________________________________________________ 这里我就说一下我是如何正确设置好一个想要的平面的颜色。 1、给平面设置正确的法向,因为是平面,所以只需要设置一个法向即可。法向是用来计算光照等。 osg::ref_ptr<osg::Vec3dArray> n = new osg::Vec3dArray; osg::Vec3 normal = { 0.0f, -1.0f, 1.0f }; normal.normalize(); n->push_back(normal); geom->setNormalBinding(osg::Geometry::BIND_OVERALL); 其中,BIND_OVERALL是所有顶点都用一个法向,即设置法向的绑定方式为全部顶点。 2、设置材质 osg::Material 在场景中设置节点的材质属性,首先要创建一个osg::Material对象,然后设置颜色和其他参数。 [cpp] view plain copy <span style="font-size:18px;">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);</span> 这里就是设置了环境光颜色,以及镜面光颜色,以及前面的shininess,值越大亮点越小,越亮。 3、创造光照,主要模拟是的自然光照,方向光 向场景添加光源的主要步骤: (1)指定场景模型的法向,就是第一步构造平面时就做的工作。 (2)允许光照并设置光照状态。 (3)指定光源属性并关联到场景图形。 osg::ref_ptr<osg::LightSource> ls = new osg::LightSource(); osg::ref_ptr< osg::Light> lt = new osg::Light; lt->setLightNum(0); lt->setPosition(osg::Vec4(0.0, -1.0, 0.0, 0)); lt->setAmbient(osg::Vec4(0.2, 0.2, 0.2, 1.0)); lt->setDiffuse(osg::Vec4(1.0, 1.0, 1.0, 1.0)); ls->setLight(lt); 对于场景中的模型,只有当其中设有单位法向时才会正确显示光照。当没有指定法向时,可以使用osgUtil::SmoothingVisitor自动生成法向。法向量必须单位化。 这样子结合法向、光照、材质就能得到想要的颜色了。主要还是靠材质来设置。光的话通常设置为太阳光的参数吧,这里参数是随便修改的。。

602

社区成员

发帖
与我相关
我的任务
社区描述
异构开发技术
社区管理员
  • OpenCL和异构编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧