几何着色器之贝塞尔曲线
#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; }