几何着色器之贝塞尔曲线

 

#include <osgViewer/Viewer>

#include <osgEarth/MapNode>
#include <osgEarth/Map>
#include <osgGA/StateSetManipulator>
#include <osgViewer/ViewerEventHandlers>
#pragma comment(lib, "osgd.lib")
#pragma comment(lib, "osgViewerd.lib")
#pragma comment(lib, "osgDBd.lib")
#pragma comment(lib, "osgUtild.lib")
#pragma comment(lib, "osgGAd.lib")
#pragma comment(lib, "osgOCeanD.lib")

const std::string strVS = "                                                                        \
                          #version 400 compatibility \n                                            \
                          void main()                                                              \
                          {                                                                        \
                            gl_Position = ftransform();                                            \
                          }                                                                        \
                          ";

const std::string strGS = "                                                                        \
                            #version 400 compatibility \n                                          \
                            #extension GL_EXT_gpu_shader4: enable \n                               \
                            #extension GL_EXT_geometry_shader4: enable \n                          \
                            void main()                                                            \
                            {                                                                      \
                                int uNum = 100;                                                    \
                                float dt = 1.0 / float(uNum);                                      \
                                float t = 0.0;                                                     \
                                for (int i = 0; i <= uNum; ++i)                                    \
                                {                                                                  \
                                    float omt = 1.0 - t;                                           \
                                    float omt2 = omt * omt;                                        \
                                    float omt3 = omt * omt2;                                       \
                                    float t2 = t * t;                                              \
                                    float t3 = t * t2;                                             \
                                    vec4  p =         omt3   * gl_PositionIn[0] +                  \
                                              3.0 * t * omt2 * gl_PositionIn[1] +                  \
                                              3.0 * t2 * omt * gl_PositionIn[2] +                  \
                                                          t3 * gl_PositionIn[3];                   \
                                    gl_Position = p;                                               \
                                    EmitVertex();                                                  \
                                    t += dt;                                                       \
                                }                                                                  \
                            }                                                                      \
                          ";
const std::string strFS = "                                                                        \
                            #version 400 compatibility \n                                          \
                            void main()                                                            \
                            {                                                                      \
                                gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);                           \
                            }                                                                      \
                           ";
osg::ref_ptr<osg::StateSet> CreateStateSet()
{
    osg::ref_ptr<osg::StateSet> stateSet = new osg::StateSet;
    osg::ref_ptr<osg::Shader> vShader = new osg::Shader(osg::Shader::VERTEX, strVS);
    osg::ref_ptr<osg::Shader> gShader = new osg::Shader(osg::Shader::GEOMETRY, strGS);
    osg::ref_ptr<osg::Shader> fShader = new osg::Shader(osg::Shader::FRAGMENT, strFS);

    osg::ref_ptr<osg::Program> program = new osg::Program;
    program->addShader(vShader.get());
    program->addShader(gShader.get());
    program->addShader(fShader.get());

    program->setParameter(GL_GEOMETRY_VERTICES_OUT_EXT, 100);
    program->setParameter(GL_GEOMETRY_INPUT_TYPE_EXT, GL_LINES_ADJACENCY_EXT);
    program->setParameter(GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_LINE_STRIP);
    stateSet->setAttributeAndModes(program.get(), osg::StateAttribute::ON);

    return stateSet.get();
}

osg::ref_ptr<osg::Geode> CreatePoints()
{
    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;
    osg::ref_ptr<osg::Vec3Array> vArray = new osg::Vec3Array;
    vArray->push_back(osg::Vec3(0.0f, 0.0f, 0.0f));
    vArray->push_back(osg::Vec3(1.0f, 1.0f, 1.0f));
    vArray->push_back(osg::Vec3(2.0f, 2.0f, 2.0f));
    vArray->push_back(osg::Vec3(3.0f, -1.0f, 0.0f));

    geometry->setVertexArray(vArray.get());
    geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::LINES_ADJACENCY, 0, vArray->size()));
    geode->addDrawable(geometry.get());
    return geode.get();
}
int main()
{
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
    osg::ref_ptr<osg::Geode> geode = CreatePoints();
    osg::ref_ptr<osg::StateSet> stateSet = CreateStateSet();
    geode->setStateSet(stateSet.get());
    viewer->setSceneData(geode);
    viewer->addEventHandler(new osgGA::StateSetManipulator(viewer->getCamera()->getStateSet()));
    viewer->addEventHandler(new osgViewer::StatsHandler);
    viewer->setUpViewInWindow(35, 35, 1024, 800);
    viewer->run();
    return EXIT_SUCCESS;
}

posted @ 2013-12-20 16:15  20118281131  阅读(1492)  评论(0编辑  收藏  举报