Example #1
0
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();
}
Example #2
0
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();
}
Example #3
0
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);
}
Example #4
0
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());
}