查看: 2108|回复: 13

osg线的渲染问题

[复制链接]

该用户从未签到

发表于 2013-6-2 22:43:56 | 显示全部楼层 |阅读模式
请问在OSG中画多线 该如何渲染成每一段一个颜色呢
比如3个点组成的一条多线,渲染成一段红色,一段绿色?

下面的代码不知如何修改

osg::ref_ptr<osg::Vec3Array> v=new osg::Vec3Array();
v->push_back(pFromPoint);
v->push_back(pMidPoint);
v->push_back(pToPoint);

osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
c->push_back(osg::Vec4(0.f,1.f,0.f,1.f));
c->push_back(osg::Vec4(1.f,0.f,0.f,1.f));
   
pLine->setColorArray(c.get());
pLine->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET );

pLine->setVertexArray(v.get());
pLine->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INE_STRIP,0,3));

该用户从未签到

发表于 2013-6-3 08:31:53 | 显示全部楼层
glShadeModel(GL_FLAT)

该用户从未签到

发表于 2013-6-3 09:54:54 | 显示全部楼层
BIND_PER_PRIMITIVE?

该用户从未签到

 楼主| 发表于 2013-6-3 12:18:45 | 显示全部楼层
liuzhiyu123 发表于 2013-6-3 08:31
glShadeModel(GL_FLAT)

谢谢 请问在哪儿设置呢?
Opengl的我还不怎么了解

该用户从未签到

 楼主| 发表于 2013-6-3 12:19:36 | 显示全部楼层
kernus@gmail.co 发表于 2013-6-3 09:54
BIND_PER_PRIMITIVE?

嗯 这个是错的,就是不知道如何实现

该用户从未签到

发表于 2013-6-3 12:33:14 | 显示全部楼层
12141162 发表于 2013-6-3 12:19
嗯 这个是错的,就是不知道如何实现

enum AttributeBinding
        {
            BIND_OFF=0,
            BIND_OVERALL,
            BIND_PER_PRIMITIVE_SET,
            BIND_PER_PRIMITIVE,
            BIND_PER_VERTEX
        };

最后一个BIND_PER_VERTEX,^_^

该用户从未签到

发表于 2013-6-3 12:40:11 | 显示全部楼层
statesetattribute

该用户从未签到

 楼主| 发表于 2013-6-3 16:18:11 | 显示全部楼层
liuzhiyu123 发表于 2013-6-3 12:40
statesetattribute

        osg::ref_ptr<osg::ShadeModel> pShadeModel=new osg::ShadeModel();
        pShadeModel->setMode(osg::ShadeModel::FLAT );

        pLine->getOrCreateStateSet()->setAttributeAndModes(pShadeModel.get(),osg::StateAttribute::ON);

        osg::ref_ptr<osg::Vec3Array> v=new osg::Vec3Array();
        v->push_back(pFromPoint);
        v->push_back(pMidPoint);
        v->push_back(pToPoint);


        osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
        c->push_back(osg::Vec4(0.f,1.f,0.f,1.f));
        c->push_back(osg::Vec4(1.f,0.f,0.f,1.f));

    pLine->setColorArray(c.get());
        pLine->setColorBinding(osg::Geometry::BIND_PER_VERTEX );

        pLine->setVertexArray(v.get());

        pLine->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INE_STRIP,0,3));

        pGeode->addDrawable(pLine.get());

谢谢 我这样写的,但是只有红色的,剩下一段是黑的了,前面的绿色不见了,不知道是那儿错了

该用户从未签到

发表于 2013-6-3 17:59:16 | 显示全部楼层
三个vertex,两个color导致的?

该用户从未签到

发表于 2013-6-3 18:38:20 | 显示全部楼层
我建议你模式改为2个点确定一条线段! pLine->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INES,0,2));
然后BIND_PER_PRIMITIVE_SET,
你现在这样划线,基本上这些绑定方式都不合适!

该用户从未签到

 楼主| 发表于 2013-6-3 18:50:30 | 显示全部楼层
kernus@gmail.co 发表于 2013-6-3 17:59
三个vertex,两个color导致的?

嗯 但就是想实现 三个顶点组成的线(两段)每段给个颜色 ————

该用户从未签到

 楼主| 发表于 2013-6-3 18:51:34 | 显示全部楼层
木子匕 发表于 2013-6-3 18:38
我建议你模式改为2个点确定一条线段! pLine->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INES, ...

嗯 试了好像也不对

该用户从未签到

发表于 2013-6-3 19:22:51 | 显示全部楼层
同意木子匕的说法,这种情况下,建议您选择绘制两个PrimitiveSet,每个指定一种颜色。

该用户从未签到

 楼主| 发表于 2013-6-3 21:09:48 | 显示全部楼层
谢谢大家的建议 最后是这么做的
        osg::ref_ptr<osg::Vec3Array> v=new osg::Vec3Array();
        v->push_back(pFromPoint);
        v->push_back(pMidPoint);
        v->push_back(pToPoint);

        osg::ref_ptr<osg::Vec4Array> c = new osg::Vec4Array;
        c->push_back(osg::Vec4(0.f,1.f,0.f,1.f));
        c->push_back(osg::Vec4(1.f,0.f,0.f,1.f));

                pLine->setColorArray(c.get());
        pLine->setColorBinding(osg::Geometry::BIND_PER_PRIMITIVE_SET );
        pLine->setVertexArray(v.get());

        pLine->addPrimitiveSet(new osg:rawArrays(osg:rimitiveSet:INES,0,2));
        pLine->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES,1,2));

        pGeode->addDrawable(pLine.get());
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表