OSG-GLSL4.0

/* -*-c++-*- Copyright (C) 2010 Wang Rui <wangray84 at gmail dot com>
* OpenSceneGraph Beginners Guide
* Implement a simple cartoon shader and apply it to models
*/

//#include <osg/Program>
//#include <osgDB/ReadFile>
//#include <osgViewer/Viewer>
//#include <osgGA/TrackballManipulator>
//#include <osg/Geode>
//#include <osg/Geometry>
//
//static const char* vertSource = {
// "#version 400\n"
// "out vec4 color;\n"
// "in mat4 mvp;\n"
// "void main()\n"
// "{\n"
// " gl_Position = mvp* gl_Position;\n"
// " color =vec4(0.0,1.0,1.0,0.0);\n"
// "}\n"
//};
//
//static const char* fragSource = {
// "in vec4 color;\n"
// "void main()\n"
// "{\n"
// " gl_FragColor = color;\n"
// "}\n"
//};
//
//int main(int argc, char** argv)
//{
// osgViewer::Viewer viewer;
// //osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
// osg::ref_ptr<osg::Geode> geode = new osg::Geode;
// osg::Geometry* geom = new osg::Geometry;
//
// osg::Vec3Array* coords = new osg::Vec3Array(8);
// (*coords)[0] = osg::Vec3d(0.0, 0.0, 0.0);
// (*coords)[1] = osg::Vec3d(1.0, 0.0, 0.0);
// (*coords)[2] = osg::Vec3d(1.0, 1.0, 0.0);
// (*coords)[3] = osg::Vec3d(0.0, 1.0, 0.0);
// (*coords)[4] = osg::Vec3d(0.0, 0.0, 1.0);
// (*coords)[5] = osg::Vec3d(1.0, 0.0, 1.0);
// (*coords)[6] = osg::Vec3d(1.0, 1.0, 1.0);
// (*coords)[7] = osg::Vec3d(0.0, 1.0, 1.0);
// geom->setVertexArray(coords);
//
// osg::Vec4Array* colours = new osg::Vec4Array(8);
// //(*colours)[0].set(1.0f, 1.0f, 1.0, 1.0f);
// (*colours)[0] = osg::Vec4d(0.0f, 0.0f, 0.0f, 1.0f);
// (*colours)[1] = osg::Vec4d(1.0f, 0.0f, 0.0f, 1.0f);
// (*colours)[2] = osg::Vec4d(1.0f, 1.0f, 0.0f, 1.0f);
// (*colours)[3] = osg::Vec4d(0.0f, 1.0f, 0.0f, 1.0f);
// (*colours)[4] = osg::Vec4d(0.0f, 0.0f, 1.0f, 1.0f);
// (*colours)[5] = osg::Vec4d(1.0f, 0.0f, 1.0f, 1.0f);
// (*colours)[6] = osg::Vec4d(1.0f, 1.0f, 1.0f, 1.0f);
// (*colours)[7] = osg::Vec4d(0.0f, 1.0f, 1.0f, 1.0f);
// geom->setColorArray(colours, osg::Array::BIND_PER_VERTEX);
//
// osg::DrawElementsUShort* drawElements = new osg::DrawElementsUShort(GL_QUADS);
// // bottom
// drawElements->push_back(0);
// drawElements->push_back(1);
// drawElements->push_back(2);
// drawElements->push_back(3);
//
// // bottom
// drawElements->push_back(3);
// drawElements->push_back(2);
// drawElements->push_back(6);
// drawElements->push_back(7);
//
// // left
// drawElements->push_back(0);
// drawElements->push_back(3);
// drawElements->push_back(7);
// drawElements->push_back(4);
//
// // right
// drawElements->push_back(5);
// drawElements->push_back(6);
// drawElements->push_back(2);
// drawElements->push_back(1);
//
// // front
// drawElements->push_back(1);
// drawElements->push_back(0);
// drawElements->push_back(4);
// drawElements->push_back(5);
//
// // top
// drawElements->push_back(7);
// drawElements->push_back(6);
// drawElements->push_back(5);
// drawElements->push_back(4);
//
// geom->addPrimitiveSet(drawElements);
//
// geode->addDrawable(geom);
//
//
//
// osg::ref_ptr<osg::Shader> vertShader = new osg::Shader(osg::Shader::VERTEX, vertSource);
// osg::ref_ptr<osg::Shader> fragShader = new osg::Shader(osg::Shader::FRAGMENT, fragSource);
//
// osg::ref_ptr<osg::Program> program = new osg::Program;
// program->addShader(vertShader.get());
// program->addShader(fragShader.get());
//
// osg::StateSet* stateset = geode->getOrCreateStateSet();
// stateset->setAttributeAndModes(program.get());
//
//
// osg::Matrix mvp ,view, projection;
// view.identity();
// //view = viewer.getCamera()->getViewMatrix();
// projection = viewer.getCamera()->getProjectionMatrix();
// projection = view;
// mvp = view * projection;
// stateset->addUniform(new osg::Uniform("mvp",mvp));
//
// viewer.setSceneData(geode.get());
//
// //viewer.setCameraManipulator(new osgGA::TrackballManipulator);
// return viewer.run();
//}


#include <osg/Node>
#include <osg/Program>
#include <osgGA/TrackballManipulator>
#include <osgViewer/Viewer>
#include <osg/Program>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>
#include <osg/Geode>
#include <osg/Geometry>

#pragma warning(pop)

// Rawish string literals (Hack until MSVC gets better C++11 support...)
// Consecutive whitespace characters will be replaced by single space.
#define R(...) #__VA_ARGS__

const int windowWidth = 800, windowHeight = 600;

const std::string vertSource = R(
#version 400\n

uniform mat4 osg_ModelViewProjectionMatrix;
uniform mat3 osg_NormalMatrix;

in vec3 osg_Vertex;
in vec3 osg_Normal;
in vec4 osg_MultiTexCoord0;

out vec2 texCoord;

void main()
{
gl_Position = osg_ModelViewProjectionMatrix * vec4(osg_Vertex, 1.0);

texCoord = osg_MultiTexCoord0.st;
});

const std::string fragSource = R(
#version 400\n

in vec2 texCoord;

out vec4 fragData;

void main()
{
fragData = vec4(texCoord.s, texCoord.t, 0.0, 1.0);
});

osg::Geometry* createQuad(const osg::Vec2& size)
{
osg::ref_ptr<osg::Geometry> geometry = new osg::Geometry;

const float w = size.x() / 2.0f;
const float h = size.y() / 2.0f;

osg::Vec3Array* vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-w, -h, 0.0f));
vertices->push_back(osg::Vec3(+w, -h, 0.0f));
vertices->push_back(osg::Vec3(-w, +h, 0.0f));
vertices->push_back(osg::Vec3(+w, +h, 0.0f));

osg::Vec3Array* normals = new osg::Vec3Array;
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));
normals->push_back(osg::Vec3(0.0f, 0.0f, 1.0f));

osg::Vec4Array* texCoords = new osg::Vec4Array;
texCoords->push_back(osg::Vec4(0.0f, 0.0f, 0.0f, 0.0f));
texCoords->push_back(osg::Vec4(1.0f, 0.0f, 0.0f, 0.0f));
texCoords->push_back(osg::Vec4(0.0f, 1.0f, 0.0f, 0.0f));
texCoords->push_back(osg::Vec4(1.0f, 1.0f, 0.0f, 0.0f));

geometry->setVertexArray(vertices);

geometry->setNormalArray(normals);
geometry->setNormalBinding(osg::Geometry::BIND_PER_VERTEX);

geometry->setTexCoordArray(0, texCoords);

geometry->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::TRIANGLE_STRIP, 0, vertices->size()));
//geometry->setUseDisplayList(false);
geometry->setUseVertexBufferObjects(true);

return geometry.release();
}

int main(int argc, char** argv)
{
//osg::setNotifyLevel(osg::DEBUG_INFO);

unsigned int screenWidth = 0, screenHeight = 0;

auto wsi = osg::GraphicsContext::getWindowingSystemInterface();
wsi->getScreenResolution(0, screenWidth, screenHeight);

osg::ref_ptr<osg::Group> root = new osg::Group;

osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(createQuad(osg::Vec2(1.0f, 1.0f)));

root->addChild(geode.get());

osg::ref_ptr<osg::Program> program = new osg::Program;
program->addShader(new osg::Shader(osg::Shader::VERTEX, vertSource));
program->addShader(new osg::Shader(osg::Shader::FRAGMENT, fragSource));

osg::StateSet* stateSet = geode->getOrCreateStateSet();
stateSet->setAttributeAndModes(program.get(), osg::StateAttribute::ON);

osgViewer::Viewer viewer;
viewer.setCameraManipulator(new osgGA::TrackballManipulator);
viewer.setSceneData(root.get());
viewer.setUpViewInWindow((screenWidth - windowWidth) / 2, (screenHeight - windowHeight) / 2, windowWidth, windowHeight);
viewer.realize();

osg::State* state = viewer.getCamera()->getGraphicsContext()->getState();
state->setUseModelViewAndProjectionUniforms(true);
state->setUseVertexAttributeAliasing(true);

return viewer.run();
}

posted on 2015-01-23 18:30  bigdudu  阅读(373)  评论(0)    收藏  举报