bool SplatRenderer::beginVisibilityPass() { if (!mIsInitialized) { init(); } if (!isSupported()) { std::cerr << "SplatRenderer error: not supported hardware\n"; return false; } if (mCurrentPass!=2) { std::cerr << "SplatRenderer error: programming error when calling beginVisibilityPass\n"; return false; } viewer->glPushAttrib(GL_ALL_ATTRIB_BITS); mCurrentPass = 0; // grab projection info viewer->glGetIntegerv(GL_VIEWPORT, mCachedVP); viewer->glGetFloatv(GL_MODELVIEW_MATRIX, mCachedMV); viewer->glGetFloatv(GL_PROJECTION_MATRIX, mCachedProj); updateRenderBuffer(); if (mCachedFlags != mFlags) configureShaders(); // configureShaders may detect that shaders are actually not supported. if (!isSupported()) { std::cerr << "SplatRenderer error: not supported hardware\n"; return false; } mCachedFlags = mFlags; mParams.update(mCachedMV, mCachedProj, mCachedVP); mParams.loadTo(mShaders[mCurrentPass]); mRenderBuffer->bind(); if (mFlags & DEFERRED_SHADING_BIT) { //GLenum buf[2] = {GL_COLOR_ATTACHMENT0_EXT,GL_COLOR_ATTACHMENT1_EXT}; GLenum buf[2] = {GL_COLOR_ATTACHMENT0,GL_COLOR_ATTACHMENT1}; //glDrawBuffersARB(2, buf); viewer->glDrawBuffers(2, buf); } viewer->glViewport(mCachedVP[0],mCachedVP[1],mCachedVP[2],mCachedVP[3]); viewer->glClearColor(0,0,0,0); viewer->glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); enablePass(mCurrentPass); ; return true; }
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 = width; traits->height = height; 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); } osgViewer::Viewer viewer; // Create a Camera that uses the above OpenGL context. osg::Camera *cam = viewer.getCamera(); cam->setGraphicsContext(gc.get()); // Must set perspective projection for fovy and aspect. cam->setProjectionMatrix(osg::Matrix::perspective(30., (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)); viewer.setSceneData(root); // for non GL3/GL4 and non GLES2 platforms we need enable the osg_ uniforms that the shaders will use, // you don't need thse two lines on GL3/GL4 and GLES2 specific builds as these will be enable by default. gc->getState()->setUseModelViewAndProjectionUniforms(true); gc->getState()->setUseVertexAttributeAliasing(true); return(viewer.run()); }