osg::Node* RenderPipeline::createDirectionalLight() { osg::ref_ptr<osg::Geode> light = createScreenQuad(osg::Vec2f(0.0f, 0.0f), 1.0f, 1.0f, mTextureWidth, mTextureHeight); osg::StateSet *ss = setShaderProgram(light, "shaders/dir_light.vert", "shaders/dir_light.frag"); ss->setAttributeAndModes(new osg::Depth(osg::Depth::ALWAYS, 0.0, 1.0, false), osg::StateAttribute::OFF); mLightPass->addChild(light.get()); return light.release(); }
int main(void){ osg::DisplaySettings::instance()->setNumMultiSamples( 4 ); viewer.setUpViewInWindow( 100, 50, 800, 600 ); viewer.getCamera()->setClearColor( osg::Vec4( 0.5,0.5,0.5,1) ); viewer.addEventHandler(new osgViewer::StatsHandler); osg::Group* scene = new osg::Group; // Création d'une boîte centrée à l'origine, de dimensions 2x3x4: osg::Box* boite = new osg::Box(osg::Vec3(-10, 0, 0), 2,3,4); osg::ShapeDrawable* boiteDrawable = new osg::ShapeDrawable(boite); osg::Geode* geodeBoite = new osg::Geode(); geodeBoite->addDrawable(boiteDrawable); osg::Sphere* sphere = new osg::Sphere( osg::Vec3(10,0,0), 1.0); osg::ShapeDrawable* sphereDrawable = new osg::ShapeDrawable(sphere); osg::Geode* geodeSphere = new osg::Geode(); geodeSphere->addDrawable(sphereDrawable); osg::Capsule* capsule = new osg::Capsule(osg::Vec3(0, 0, 0), 1.0, 3.0); osg::ShapeDrawable* capsuleDrawable = new osg::ShapeDrawable(capsule); osg::Geode* geodeCapsule = new osg::Geode(); geodeCapsule->addDrawable(capsuleDrawable); osg::Cone* cone = new osg::Cone(osg::Vec3(0, 10, 0), 1, 2); osg::ShapeDrawable* coneDrawable = new osg::ShapeDrawable(cone); osg::Geode* geodeCone= new osg::Geode(); geodeCone->addDrawable(coneDrawable); osg::Material* matBoite = new osg::Material; matBoite->setAmbient (osg::Material::FRONT_AND_BACK, osg::Vec4(0.5, 0.0, 0.0, 1.0)); matBoite->setDiffuse (osg::Material::FRONT_AND_BACK, osg::Vec4(0.9, 0.0, 0.0, 1.0)); matBoite->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.2, 0.2, 0.2, 1.0)); matBoite->setShininess(osg::Material::FRONT_AND_BACK, 64); osg::Material* matCone = new osg::Material; matCone->setAmbient (osg::Material::FRONT_AND_BACK, osg::Vec4(0.5, 0.0, 0.5, 1.0)); matCone->setDiffuse (osg::Material::FRONT_AND_BACK, osg::Vec4(0.9, 0.0, 0.9, 1.0)); matCone->setSpecular(osg::Material::FRONT_AND_BACK, osg::Vec4(0.2, 0.2, 0.2, 1.0)); matCone->setShininess(osg::Material::FRONT_AND_BACK, 64); osg::Node* aregne = osgDB::readNodeFile("cow_high.3ds"); transformAregne->setPosition(osg::Vec3(5, 0, 0)); transformAregne->setScale(osg::Vec3(0.2, 0.2, 0.2)); transformAregne->getOrCreateStateSet()->setMode(GL_NORMALIZE,osg::StateAttribute::ON); transformAregne->addChild(aregne); boiteDrawable->getOrCreateStateSet()->setAttributeAndModes(matBoite); coneDrawable->getOrCreateStateSet()->setAttributeAndModes(matCone); /*scene->addChild(geodeCapsule); scene->addChild(geodeCone); scene->addChild(geodeBoite); scene->addChild(geodeSphere); scene->addChild(transformAregne);*/ scene->addChild(aregne); // Création d'une texture osg::ref_ptr<osg::Texture2D> tex2D = new osg::Texture2D; tex2D->setTextureSize(1024, 1024); tex2D->setInternalFormat(GL_RGBA); // Création d'une caméra qui effectuera son rendu dans la texture osg::ref_ptr<osg::Camera> rttCamera = createRTTCamera(osg::Camera::COLOR_BUFFER, tex2D.get()); // On indique la partie du graphe que la caméra devra rendre, ici toute la scène : rttCamera->addChild(scene); // Création d'une caméra permettant d'afficher un HUD qui couvrira tout l'écran osg::ref_ptr<osg::Camera> hudCamera = createHUDCamera(); osg::Geode* screenQuad = createScreenQuad(); hudCamera->addChild(screenQuad); osg::StateSet* stateset = screenQuad->getOrCreateStateSet(); stateset->setTextureAttributeAndModes(0, tex2D.get()); // VOUS METTREZ ICI LE CODE DE LA QUESTION 7 // Création d'une nouvelle racine du graphe, à laquelle on rattache la caméra // de rendu dans une texture, la caméra du HUD et la racine du graphe de la scène osg::ref_ptr<osg::Group> root = new osg::Group; root->addChild(rttCamera.get()); root->addChild(hudCamera.get()); root->addChild(scene); // Indique au viewer la scène à affich trackCone->setTrackNode(geodeCone); trackCone->setTrackerMode(osgGA::NodeTrackerManipulator::NODE_CENTER); trackBoite->setTrackNode(geodeBoite); trackBoite->setTrackerMode(osgGA::NodeTrackerManipulator::NODE_CENTER); trackSphere->setTrackNode(geodeSphere); trackSphere->setTrackerMode(osgGA::NodeTrackerManipulator::NODE_CENTER); transformAregne->setUpdateCallback(new Deplacement); viewer.setSceneData(scene); osg::ref_ptr<GestionEvenements> gestionnaire = new GestionEvenements(); viewer.addEventHandler(gestionnaire.get()); return viewer.run(); }
void App::init() { SDL_Init(SDL_INIT_EVERYTHING); window = SDL_CreateWindow("Try hard!", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screen_width, screen_height, SDL_WINDOW_OPENGL); SDL_GLContext glContext = SDL_GL_CreateContext(window); if (glContext == nullptr) std::cout << "SDLFEL"; GLenum error = glewInit(); if (error != GLEW_OK) std::cout << "GlewFel!"; SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); glClearColor(0.7f, 0.7f, 1.0f, 1.0); glEnable(GL_DEPTH_TEST); initShader(); initGaussTex(); importer = new OBJimporter(); importer->loadObj("models/sphere1.obj"); models = importer->CreateTriangleData(); models[0]->createBBox("sphere.txt"); models[0]->addTranslation(vec3(5, 2, -5)); models[0]->initNormalTexture("normalMap.png"); delete importer; importer = new OBJimporter(); std::vector<Model*> xxx; importer->loadObj("models/skyBox.obj"); xxx = importer->CreateTriangleData(); xxx[0]->createBBox("box.txt"); xxx[0]->addTranslation(vec3(0, 19, 0)); xxx[0]->Scale(vec3(40,40,40)); models.push_back(xxx[0]); delete importer; importer = new OBJimporter(); std::vector<Model*> temp; importer->loadObj("models/box.obj"); temp = importer->CreateTriangleData(); temp[0]->createBBox("box.txt"); Model* box2; box2 = new Model(*temp[0]); Model* box3; box3 = new Model(*temp[0]); temp[0]->addTranslation(vec3(3,0,3)); box2->addTranslation(vec3(-18, 10, -18)); box3->addTranslation(vec3(10, 3, -3)); models.push_back(temp[0]); models.push_back(box2); models.push_back(box3); Model* boxTemplate; /*for (int i = 0; i < 2000; i++) { boxTemplate = new Model(*models[0]); boxTemplate->addTranslation(vec3(i % 40 - 20, 5, (int)(i/40)-20)); models.push_back(boxTemplate); } for (int i = 0; i < 2000; i++) { boxTemplate = new Model(*temp[0]); boxTemplate->addTranslation(vec3(i % 40 - 20, 3, (int)(i / 40) - 20)); models.push_back(boxTemplate); }*/ unsigned char* Pheightmap = nullptr; Model* hm = importer->getGround("height_map2.bmp", Pheightmap); this->terrain = hm; _player.setHM(Pheightmap); delete importer; createScreenQuad(); quadTree = new QuadTree(vec3(-25, 0, 25), 50); quadTree->buildTree(models); }
void RenderPipeline::initialize(osg::Group *scene, int width, int height) { if(mGraph.valid()) deinitialize(); mScreenWidth = mTextureWidth = width; mScreenHeight = mTextureHeight = height; mGBufferColors = createTextureRect(mTextureWidth, mTextureHeight, GL_RGBA16F, GL_RGBA, GL_FLOAT); mGBufferNormals = createTextureRect(mTextureWidth, mTextureHeight, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE); mGBufferPositions = createTextureRect(mTextureWidth, mTextureHeight, GL_RGBA16F, GL_RGBA, GL_FLOAT); mDepthStencil = createTextureRect(mTextureWidth, mTextureHeight, GL_DEPTH32F_STENCIL8, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV); mDiffuseLight = createTextureRect(mTextureWidth, mTextureHeight, GL_RGBA16F, GL_RGBA, GL_FLOAT); mSpecularLight = createTextureRect(mTextureWidth, mTextureHeight, GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE); mFinalBuffer = createTextureRect(mTextureWidth, mTextureHeight, GL_RGBA16F, GL_RGBA, GL_FLOAT); int pre_render_pass = 0; // Clear pass (clears specular and depth buffers) mClearPass = createRTTCamera(osg::Camera::COLOR_BUFFER, mSpecularLight.get()); mClearPass->setNodeMask(Renderer::Mask_RTT); mClearPass->attach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, mDepthStencil.get()); mClearPass->setRenderOrder(osg::Camera::PRE_RENDER, pre_render_pass++); // Main pass (generates colors, normals, positions, and emissive diffuse lighting). mMainPass = createRTTCamera(osg::Camera::COLOR_BUFFER0, mGBufferColors.get()); mMainPass->attach(osg::Camera::COLOR_BUFFER1, mGBufferNormals.get()); mMainPass->attach(osg::Camera::COLOR_BUFFER2, mGBufferPositions.get()); mMainPass->attach(osg::Camera::COLOR_BUFFER3, mDiffuseLight.get()); mMainPass->attach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, mDepthStencil.get()); // FIXME: Once sky rendering is implemented, don't clear buffers here //mMainPass->setClearMask(GL_NONE); mMainPass->setRenderOrder(osg::Camera::PRE_RENDER, pre_render_pass++); osg::StateSet *ss = mMainPass->getOrCreateStateSet(); ss->addUniform(new osg::Uniform("illumination_color", osg::Vec4())); { // Make sure to clear stencil bit 0x1 by default (geometry that doesn't // want external lighting should set bit 0x1 on z-pass). osg::ref_ptr<osg::Stencil> stencil = new osg::Stencil(); stencil->setWriteMask(~0); stencil->setFunction(osg::Stencil::ALWAYS, 0x00, 0x01); stencil->setOperation(osg::Stencil::KEEP, osg::Stencil::KEEP, osg::Stencil::REPLACE); ss->setAttributeAndModes(stencil.get()); } mMainPass->addChild(scene); // Lighting pass (generates diffuse and specular). mLightPass = createRTTCamera(osg::Camera::COLOR_BUFFER0, mDiffuseLight.get()); mLightPass->setNodeMask(Renderer::Mask_RTT); mLightPass->attach(osg::Camera::COLOR_BUFFER1, mSpecularLight.get()); mLightPass->attach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, mDepthStencil.get()); mLightPass->setClearMask(GL_NONE); mLightPass->setRenderOrder(osg::Camera::PRE_RENDER, pre_render_pass++); mLightPass->setCullingMode(osg::CullSettings::NO_CULLING); mLightPass->setProjectionResizePolicy(osg::Camera::FIXED); mLightPass->setProjectionMatrixAsOrtho2D(0.0, 1.0, 0.0, 1.0); ss = mLightPass->getOrCreateStateSet(); ss->setAttributeAndModes(new osg::BlendFunc(GL_ONE, GL_ONE)); ss->setAttributeAndModes(new osg::Depth(osg::Depth::GEQUAL, 0.0, 1.0, false)); ss->setTextureAttribute(0, mGBufferColors.get()); ss->setTextureAttribute(1, mGBufferNormals.get()); ss->setTextureAttribute(2, mGBufferPositions.get()); ss->addUniform(new osg::Uniform("ColorTex", 0)); ss->addUniform(new osg::Uniform("NormalTex", 1)); ss->addUniform(new osg::Uniform("PosTex", 2)); // Default light values ss->addUniform(new osg::Uniform("ambient_color", osg::Vec4f(0.2f, 0.2f, 0.2f, 1.0f))); ss->addUniform(new osg::Uniform("diffuse_color", osg::Vec4f(1.0f, 1.0f, 1.0f, 1.0f))); ss->addUniform(new osg::Uniform("specular_color", osg::Vec4f(1.0f, 1.0f, 1.0f, 1.0f))); { // Skip lighting for pixels that have stencil bit 0x1 set osg::ref_ptr<osg::Stencil> stencil = new osg::Stencil(); stencil->setWriteMask(0); stencil->setFunction(osg::Stencil::EQUAL, 0x0, 0x1); stencil->setOperation(osg::Stencil::KEEP, osg::Stencil::KEEP, osg::Stencil::KEEP); ss->setAttributeAndModes(stencil.get()); } // Combiner pass (combines colors, diffuse, and specular). mCombinerPass = createRTTCamera(osg::Camera::COLOR_BUFFER, mFinalBuffer.get()); mCombinerPass->setNodeMask(Renderer::Mask_RTT); mCombinerPass->attach(osg::Camera::PACKED_DEPTH_STENCIL_BUFFER, mDepthStencil.get()); mCombinerPass->setClearMask(GL_NONE); mCombinerPass->setRenderOrder(osg::Camera::PRE_RENDER, pre_render_pass++); mCombinerPass->setReferenceFrame(osg::Transform::ABSOLUTE_RF); mCombinerPass->setProjectionResizePolicy(osg::Camera::FIXED); mCombinerPass->setProjectionMatrix(osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0)); ss = setShaderProgram(mCombinerPass.get(), "shaders/combiner.vert", "shaders/combiner.frag"); ss->setAttributeAndModes(new osg::Depth(osg::Depth::ALWAYS, 0.0, 1.0, false), osg::StateAttribute::OFF); ss->setTextureAttribute(0, mGBufferColors.get()); ss->setTextureAttribute(1, mDiffuseLight.get()); ss->setTextureAttribute(2, mSpecularLight.get()); ss->addUniform(new osg::Uniform("ColorTex", 0)); ss->addUniform(new osg::Uniform("DiffuseTex", 1)); ss->addUniform(new osg::Uniform("SpecularTex", 2)); mCombinerPass->addChild(createScreenQuad(osg::Vec2f(), 1.0f, 1.0f, mTextureWidth, mTextureHeight)); // Final output to back buffer mOutputPass = new osg::Camera(); mOutputPass->setNodeMask(Renderer::Mask_RTT); mOutputPass->setClearMask(GL_NONE); mOutputPass->setRenderOrder(osg::Camera::POST_RENDER, -1); mOutputPass->setReferenceFrame(osg::Transform::ABSOLUTE_RF); mOutputPass->setProjectionResizePolicy(osg::Camera::FIXED); mOutputPass->setProjectionMatrix(osg::Matrix::ortho2D(0.0, 1.0, 0.0, 1.0)); mOutputPass->setViewport(0, 0, mScreenWidth, mScreenHeight); mOutputPass->setAllowEventFocus(false); ss = setShaderProgram(mOutputPass.get(), "shaders/quad_rect.vert", "shaders/quad_rect.frag"); ss->setTextureAttribute(0, mFinalBuffer.get()); ss->addUniform(new osg::Uniform("ImageTex", 0)); ss->setAttributeAndModes(new osg::Depth(osg::Depth::ALWAYS, 0.0, 1.0, false), osg::StateAttribute::OFF); mOutputPass->addChild(createScreenQuad(osg::Vec2f(), 1.0f, 1.0f, mTextureWidth, mTextureHeight)); // Graph. mGraph = new osg::Group(); mGraph->addChild(mClearPass.get()); mGraph->addChild(mMainPass.get()); mGraph->addChild(mLightPass.get()); mGraph->addChild(mCombinerPass.get()); mGraph->addChild(mOutputPass.get()); }