#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;
}
![]()