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();
}
浙公网安备 33010602011771号