Jhon_Karter 发表于 2019-3-20 17:46:53

osg二维中使用osgFX::Outline设置轮廓没有用

问题描述:

步骤1:
        我用平行投影的方式实现osg的二维效果,如下


        // 设置为正交投影
        pCamera->setProjectionMatrixAsOrtho2D(-150, 150, -150, 150);

        // 保证图形不变形
        double dAspectRatio(1.0);
        double dNewAspectRatio = double(traits->width) / double(traits->height);
        double dAspectRatioChange = dNewAspectRatio / dAspectRatio;
        if (dAspectRatioChange != 1.0)
        {
                pCamera->getProjectionMatrix() *= osg::Matrix::scale(1.0 / dAspectRatioChange, 1.0, 1.0);
        }


然后使用多边形和文字绘制了一个坐标轴,坐标轴的一部分如下


步骤2:
使用osgFX::Outline显示图形节点的轮廓,如下

        osg::ref_ptr<osgFX::Outline> outlineNode = new osgFX::Outline;
        osg::Vec4 color(0.0, 127.0, 255.0, 255.0);
        color.normalize();

        outlineNode->setWidth(10.0f);
        outlineNode->setColor(color);

        outlineNode->addChild(pNode);
        pFarNode->replaceChild(pNode, outlineNode);
                               
        //Outline类的使用需要先用0清空StencilBuffer
        osg::DisplaySettings::instance()->setMinimumNumStencilBits(1);
        unsigned int clearMask = _pCamera->getClearMask();
        _pCamera->setClearMask(clearMask | GL_STENCIL_BUFFER_BIT);
        _pCamera->setClearStencil(0);

/

结果:
但是最后显示的效果却不让人满意,如下


只在这个三角形的一边显示了轮廓,不知道是什么原因:'( ,请求各位大佬指点

Jhon_Karter 发表于 2019-3-20 17:49:16

对了,使用outline包裹的节点pNode就是那个三角形的节点,本来应该在这个三角形的外面有轮廓,但是却只有一边:'(

Jhon_Karter 发表于 2019-3-21 20:04:35

终于找到原因了,使用outline给节点添加轮廓时,在2d中绘制多边形时,绘制多边形的多个点
必须要顺时针传入,虽然逆时针传入也能绘制出来,但是这样不会正常显示轮廓。
页: [1]
查看完整版本: osg二维中使用osgFX::Outline设置轮廓没有用