CPP file:

Code:
#include "osgDB/ReadFile"
#include "osgViewer/Viewer"

struct ModelViewProjectionMatrixCallback : public osg::Uniform::Callback {
    ModelViewProjectionMatrixCallback(osg::Camera *fCamera) :
        _camera(fCamera) {
    }

    virtual void operator()(osg::Uniform *uniform, osg::NodeVisitor *nv) {
        osg::Matrixd viewMatrix = _camera->getViewMatrix();
        osg::Matrixd modelMatrix = osg::computeLocalToWorld(nv->getNodePath());
        osg::Matrixd modelViewProjectionMatrix = modelMatrix * viewMatrix * 
_camera->getProjectionMatrix();
        uniform->set(modelViewProjectionMatrix);
    }

    osg::Camera *_camera;
};

osg::ref_ptr<osg::Program> createProgram(std::string fProgramName, std::string 
fVertexShader, std::string fGeometryShader, std::string fFragmentShader)
{
    osg::ref_ptr<osg::Shader> vertexShader = 
osgDB::readShaderFile(fVertexShader);
    osg::ref_ptr<osg::Shader> geometryShader = 
osgDB::readShaderFile(fGeometryShader);
    osg::ref_ptr<osg::Shader> fragmentShader = 
osgDB::readShaderFile(fFragmentShader);

    osg::ref_ptr<osg::Program> program = new osg::Program;
    program->setName(fProgramName);
    program->addShader(vertexShader);
    program->addShader(geometryShader);
    program->addShader(fragmentShader);

    return program.release();
}

int main(int argc, char **argv)
{
    // Program
    osg::ref_ptr<osg::Program> program = createProgram("SinglePass", 
"singlepass.vert", "singlepass.geom", "singlepass.frag");

    // Vertices
    osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
    vertices->push_back(osg::Vec3(0.5f, 0.0f, 0.5f));

    // Geometry
    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
    geom->setUseDisplayList(false);
    geom->setVertexArray(vertices);
    geom->setVertexAttribArray(0, vertices);
    geom->addPrimitiveSet(new osg::DrawArrays(GL_POINTS, 0, vertices->size()));

    // Geode
    osg::ref_ptr<osg::Geode> screenGeode = new osg::Geode;
    screenGeode->addDrawable(geom);

    // State set
    osg::StateSet *geomStateSet = geom->getOrCreateStateSet();
    geomStateSet->setAttribute(program);
    osg::ref_ptr<osg::Point> point = new osg::Point;
    point->setSize(5.0f);
    geomStateSet->setAttribute(point);

    // Viewer
    osgViewer::Viewer viewer;
    viewer.setSceneData(screenGeode.get());
    viewer.setUpViewInWindow(50, 50, 800, 600, 0);
    viewer.getCamera()->setViewport(0, 0, 800, 600);
    viewer.getCamera()->setClearMask(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    viewer.getCamera()->setClearColor(osg::Vec4(0.2f, 0.2f, 0.2f, 1.0f));

    // MVP
    osg::ref_ptr<osg::Uniform> MVP = new osg::Uniform(osg::Uniform::FLOAT_MAT4, 
"ModelviewProjection");
    MVP->setUpdateCallback(new 
ModelViewProjectionMatrixCallback(viewer.getCamera()));
    geomStateSet->addUniform(MVP);

    return viewer.run();
}



Vertex shader:

Code:
#version 330

in vec4 Position;
out vec4 vPosition;
uniform mat4 ModelviewProjection;

void main()
{
    gl_Position = ModelviewProjection * Position;
    vPosition = Position;
}



Geometry shader:

Code:
#version 330

layout(points) in;
layout(triangle_strip, max_vertices = 24) out;

in vec4 vPosition[1];

uniform mat4 ModelviewProjection;
uniform mat4 ProjectionMatrix;
uniform mat4 ViewMatrix;
uniform mat4 Modelview;

vec4 objCube[8]; // Object space coordinate of cube corner
vec4 ndcCube[8]; // Normalized device coordinate of cube corner
ivec4 faces[6]; // Vertex indices of the cube faces

void emit_vert(int vert)
{
    gl_Position = ndcCube[vert];
    EmitVertex();
}

void emit_face(int face)
{
    emit_vert(faces[face][1]); emit_vert(faces[face][0]);
    emit_vert(faces[face][3]); emit_vert(faces[face][2]);
    EndPrimitive();
}

void main()
{
        faces[0] = ivec4(0,1,3,2); faces[1] = ivec4(5,4,6,7);
        faces[2] = ivec4(4,5,0,1); faces[3] = ivec4(3,2,7,6);
        faces[4] = ivec4(0,3,4,7); faces[5] = ivec4(2,1,6,5);

        vec4 P = vPosition[0];
        vec4 I = vec4(0.25,0,0,0);
        vec4 J = vec4(0,0.25,0,0);
        vec4 K = vec4(0,0,0.25,0);

        objCube[0] = P+K+I+J; objCube[1] = P+K+I-J;
        objCube[2] = P+K-I-J; objCube[3] = P+K-I+J;
        objCube[4] = P-K+I+J; objCube[5] = P-K+I-J;
        objCube[6] = P-K-I-J; objCube[7] = P-K-I+J;

        // Transform the corners of the box:
        for (int vert = 0; vert < 8; vert++)
                ndcCube[vert] = ModelviewProjection * objCube[vert];

        // Emit the six faces:
        for (int face = 0; face < 6; face++)
                emit_face(face);
}



Fragment shader:

Code:
#version 330

out vec4 FragColor;

void main()
{
        FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}



------------------
Read this topic online here:
http://forum.openscenegraph.org/viewtopic.php?p=61030#61030





_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to