Happy New Year, everyone --
Attached is source code that demonstrates OSG rendering using an OpenGL 3.x
context. At the bottom of the source is a comment block describing how to build
OSG for OpenGL 3.x.
I hope this is helpful.
--
-Paul Martz Skew Matrix Software
http://www.skew-matrix.com/
#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osg/GraphicsContext>
#include <osg/Camera>
#include <osg/Viewport>
#include <osg/StateSet>
#include <osg/Program>
#include <osg/Shader>
void configureShaders( osg::StateSet* stateSet )
{
const std::string vertexSource =
"#version 140 \n"
" \n"
"uniform mat4 osg_ModelViewProjectionMatrix; \n"
"uniform mat4 osg_ModelViewMatrix; \n"
"uniform mat3 osg_NormalMatrix; \n"
" \n"
"in vec4 osg_Vertex; \n"
"in vec3 osg_Normal; \n"
"out vec4 color; \n"
" \n"
"void main() \n"
"{ \n"
" vec3 ecVertex = vec3( osg_ModelViewMatrix * osg_Vertex ); \n"
" vec3 ecNormal = normalize( osg_NormalMatrix * osg_Normal ); \n"
" vec3 lightDir = vec3( 0., 0., 1. ); \n"
" float diffuse = max( dot( lightDir, ecNormal ), 0. ); \n"
" color = vec4( vec3( diffuse ), 1. ); \n"
" \n"
" gl_Position = osg_ModelViewProjectionMatrix * osg_Vertex; \n"
"} \n";
osg::Shader* vShader = new osg::Shader( osg::Shader::VERTEX, vertexSource );
const std::string fragmentSource =
"#version 140 \n"
" \n"
"in vec4 color; \n"
"out vec4 fragData; \n"
" \n"
"void main() \n"
"{ \n"
" fragData = color; \n"
"} \n";
osg::Shader* fShader = new osg::Shader( osg::Shader::FRAGMENT,
fragmentSource );
osg::Program* program = new osg::Program;
program->addShader( vShader );
program->addShader( fShader );
stateSet->setAttribute( program, osg::StateAttribute::ON );
}
int main( int argc, char** argv )
{
osg::ArgumentParser arguments( &argc, argv );
osg::Node* root = osgDB::readNodeFiles( arguments );
if( root == NULL )
{
osg::notify( osg::FATAL ) << "Unable to load model from command line."
<< std::endl;
return( 1 );
}
configureShaders( root->getOrCreateStateSet() );
const int width( 800 ), height( 450 );
const std::string version( "3.1" );
osg::ref_ptr< osg::GraphicsContext::Traits > traits = new
osg::GraphicsContext::Traits();
traits->x = 20; traits->y = 30;
traits->width = 800; traits->height = 450;
traits->windowDecoration = true;
traits->doubleBuffer = true;
traits->glContextVersion = version;
osg::ref_ptr< osg::GraphicsContext > gc =
osg::GraphicsContext::createGraphicsContext( traits.get() );
if( !gc.valid() )
{
osg::notify( osg::FATAL ) << "Unable to create OpenGL v" << version <<
" context." << std::endl;
return( 1 );
}
// Create a Camera that uses the above OpenGL context.
osg::Camera* cam = new osg::Camera;
cam->setGraphicsContext( gc.get() );
// Must set perspective projection; default ortho confuses
TrackballManipulator home computation.
cam->setProjectionMatrix( osg::Matrix::perspective( 60.,
(double)width/(double)height, 1., 100. ) );
// Unlike OpenGL, OSG viewport does *not* default to window dimensions.
cam->setViewport( new osg::Viewport( 0, 0, width, height ) );
osgViewer::Viewer viewer;
viewer.setCamera( cam );
viewer.setSceneData( root );
return( viewer.run() );
}
/*
Building OSG for OpenGL 3.x
OSG currently support OpenGL 3.x on Windows. This comment block describes the
necessary configuration steps.
Get the draft gl3.h header file from OpenGL.org and put it in a folder called
GL3 somewhere on your hard drive. OSG includes this header as <GL3/gl3.h>. Get
gl3.h from here:
http://www.opengl.org/registry/
Open the cmake-gui and load OSG's top-level CmakeLists.txt. You'll need to make
several changes.
* Add the path to <GL3/gl3.h> to the CMake compiler flags, CMAKE_CXX_FLAGS and
CMAKE_CXX_FLAGS_DEBUG (for release and debug builds; others if you use other
build configurations). The test to add should look something like this:
/I C:\GLHeader
The folder GLHeader should contain a subfolder GL3, which in turn contains
gl3.h.
* Enable the following CMake variable:
OSG_GL3_AVAILABLE
* Disable the following CMake variables:
OSG_GL1_AVAILABLE
OSG_GL2_AVAILABLE
OSG_GLES1_AVAILABLE
OSG_GLES2_AVAILABLE
OSG_GL_DISPLAYLISTS_AVAILABLE
OSG_GL_FIXED_FUNCTION_AVAILABLE
OSG_GL_MATRICES_AVAILABLE
OSG_GL_VERTEX_ARRAY_FUNCS_AVAILABLE
OSG_GL_VERTEX_FUNCS_AVAILABLE
* Additionally, leave BUILD_OSG_EXAMPLES disabled. None of the existing
examples use GL3, so there's no point in building them.
Create your project files in cmake-gui as usual, and build OSG as usual.
If you have an external project that will depend on OSG built for OpenGL 3.x,
you'll need to ensure your external project also uses the compiler include
directives to find <GL3/gl3.h>.
*/
_______________________________________________
osg-users mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org