OpenSceneGraph Paulo Ivson [email protected] Exemplos Exemplo: arquivo de modelo int main( int argc, char** argv ) { osgViewer::Viewer viewer; viewer.setSceneData( osgDB::readNodeFile("cessna.osg") ); return viewer.run(); } Exemplo: ShapeDrawable int main( int argc, char** argv ) { osg::Sphere* sphere = new osg::Sphere( osg::Vec3(0,0,0), 1.0); osg::ShapeDrawable* drawable = new osg::ShapeDrawable(sphere); osg::Geode* geode = new osg::Geode(); geode->addDrawable(drawable); osgViewer::Viewer viewer; viewer.setSceneData( geode ); return viewer.run(); } Exemplo: Groups e Transforms osg::Group* root = new osg::Group(); osg::Box* unitCube = new osg::Box( osg::Vec3(0,0,0), 1.0f); osg::ShapeDrawable* unitCubeDrawable = new osg::ShapeDrawable(unitCube); osg::Geode* basicShapesGeode = new osg::Geode(); basicShapesGeode->addDrawable(unitCubeDrawable); root->addChild(basicShapesGeode); osg::Sphere* unitSphere = new osg::Sphere( osg::Vec3(0,0,0), 1.0); osg::ShapeDrawable* unitSphereDrawable = new osg::ShapeDrawable(unitSphere); osg::Geode* unitSphereGeode = new osg::Geode(); unitSphereGeode->addDrawable(unitSphereDrawable); osg::PositionAttitudeTransform* sphereXForm = new osg::PositionAttitudeTransform(); sphereXForm->setPosition(osg::Vec3(2.5,0,0)); sphereXForm->addChild(unitSphereGeode); root->addChild(sphereXForm); Exemplo: Textures osg::Texture2D* faceTexture = new osg::Texture2D; osg::Image* image = osgDB::readImageFile("KLN89FaceB.tga"); faceTexture->setImage(image); osg::StateSet* ss = root->getOrCreateStateSet(); ss->setTextureAttributeAndModes(0, faceTexture ,osg::StateAttribute::ON); Exemplo: StateSets osg::StateSet* blendStateSet = new osg::StateSet(); osg::TexEnv* blendTexEnv = new osg::TexEnv(); blendTexEnv->setMode(osg::TexEnv::BLEND); blendStateSet->setTextureAttributeAndModes(0,faceTexture,osg::StateAttribute::ON); blendStateSet->setTextureAttribute(0,blendTexEnv); osg::StateSet* decalStateSet = new osg::StateSet(); osg::TexEnv* decalTexEnv = new osg::TexEnv(); decalTexEnv->setMode(osg::TexEnv::DECAL); decalStateSet->setTextureAttributeAndModes(0,faceTexture,osg::StateAttribute::ON); decalStateSet->setTextureAttribute(0,decalTexEnv); root->setStateSet(blendStateSet); unitSphereGeode->setStateSet(decalStateSet); Arquitetura Arquitetura Sua aplicação Carregamento de arquivos Classes principais da biblioteca Extensões do grafo por terceiros Arquitetura O core do OSG oferece: Classes para montagem do grafos de cena Métodos para operar sobre o grafo Funcionalidades típicas em aplicações 3D Acesso aos plugins de carregamento de arquivos de textura e modelos Arquitetura Os NodeKits do OSG: Estendem as funcionalidades de Nós, objetos desenháveis e atributos de renderização Permitem a tradução dos novos objetos gerados para o arquivo nativo do OSG (.osg ou .ive) Arquitetura Os Plugins do OSG oferecem: Carregamento de diversos formatos existentes de imagem 2D, modelo 3D, fonte e vídeo Busca automática pelo plugin correto para cada formato Arquitetura Formatos suportados pelos plugins do OSG: .md2 – Quake .txp – Terrex TerraPage .osg e .ive - Modelos nativos do OSG .x – Modelos do DirectX .3ds – 3dsmax .mov – Vídeo Quicktime .obj – Alias Wavefront .geo – Carbon Graphics’ Geo .bmp, .dds, .gif, .jpeg, .pic, .png, .rgb, .tga, e .tiff – Texturas .dae – COLLADA .shp – ESRI Shapefile .zip – Plugin de ZIP que permite a abertura de modelos em arquivos ZIP .lwo e .lws – NewTek LightWave (.lwo e.lws) Plugin para carregamento destes modelos a partir da internet .flt – OpenFlight Arquitetura Sua Aplicação API do OSG API de introsp. do OSG OSG Core OSG NodeKits OSG Plugins osg osgFX osgdb_osg osgUtil osgManipulator osgdb_3ds osgDB osgParticle osgdb_png osgGA osgSim osgdb_jpg osgViewer osgText osgdb_zip osgTerrain outros ... osgShadow A biblioteca osg oferece classes para: Componentes do OSG Core Montagem de grafos de cena Matemática com vetores e matrizes Representação Geométrica Estados OpenGL (aparência) Animações OSG Core osg osgUtil osgDB apartamento osgGA osgViewer sala quarto varanda parede chão cama cama chão parede mesa de jantar planta tampo cadeira cadeira A biblioteca osgUtil oferece classes para: Realizar operações sobre o grafo de cena: Coletar os nós do grafo para renderizá-los Calcular interseção com nós do grafo Reunir estatísticas Otimizar o grafo de cena Também oferece Componentes do OSG Core OSG Core osg osgUtil Triangulação de Delaunay Geração de triangle strips osgDB Geração de coordenadas de textura osgGA osgViewer A biblioteca osgUtil oferece classes para: Realizar operações sobre o grafo de cena: Coletar os nós do grafo para renderizá-los Calcular interseção com nós do grafo Reunir estatísticas Otimizar o grafo de cena Também oferece Componentes do OSG Core OSG Core osg osgUtil Triangulação de Delaunay Geração de triangle strips osgDB Geração de coordenadas de textura osgGA osgViewer A biblioteca osgDB oferece classes para: Carregar e salvar modelos e imagens usando os plugins do OSG Permitir ao desenvolvedor criar plugins para carregar e salvar modelos em outros formatos Útil para formatos proprietários ou formatos que o OSG não suporte Componentes do OSG Core OSG Core osg osgUtil osgDB “c:/temp/imagem.png” osgGA osgViewer osgDB::readImageFile() osgdb_png.dll OSG Plugins osgdb_osg osg::Image* osgdb_3ds osgdb_png outros ... A biblioteca osgGA oferece classes para: Receber e processar eventos de mouse e teclado Movimentar a câmera pelo modelo Transformar esses eventos em alterações na cena Componentes do OSG Core OSG Core osg osgUtil osgDB Event MOUSE_PUSH osgGA Event osgViewer KEYDOWN Viewer osgGA::MatrixManipulator A biblioteca osgViewer oferece classes para: Integrar a visualização do OSG a diversas toolkits de janela (AGL/CGL, Cocoa, FLTK, Fox, MFC, Qt, SDL, Win32, WxWindows, W11, etc) Visualizações em janela única Visualizações com múltiplas vistas e superfícies de desenho renderizadas usando múltiplos processadores Processamento de eventos Carregar dados do disco em background Componentes do OSG Core OSG Core osg osgUtil osgDB osgGA osgViewer O NodeKit osgFX oferece classes para a renderização de efeitos especiais como: Iluminação anisotropica Bumb mapping Cartoon Shading Luzes especulares Rendering com Outline Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow O NodeKit osgManipulation oferece classes para manipular objetos do grafo de cena: Mover Rotacionar Modificar escala Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow O NodeKit osgParticle permite a criação de efeitos baseados em simulações de partículas como explosões, fogo e fumaça Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow O NodeKit osgSim atende a demandas específicas de certos sistemas de simulação e modelos OpenFlight: Consultas a dados de elevação de terreno Luzes pontuais Transformações Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow O NodeKit osgText oferece suporte completo ao desenho fontes TrueType em 2D e 3D Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow O NodeKit osgTerrain oferece suporte para a renderização de dados de altimetria Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow O NodeKit osgShadow oferece suporte para a diversas técnicas de renderização de sombras Componentes do OSG Core OSG NodeKits osgFX osgManipulator osgParticle osgSim osgText osgTerrain osgShadow Arquitetura (Fim) Sua aplicação Tipos de Nós Contagem de Referências (1/2) Group Transform Transform Transform 1 ref 1 ref Geode 3 refs Objetos do OSG derivam indiretamente de osg::Referenced Essa classe permite a liberação automática desses objetos quando ninguém mais os está referenciando Para que funcione, é necessário usar ponteiros do tipo osg::ref_ptr Essa classe é responsável por atualizar a contagem de referências em cada objeto Contagem de Referências (2/2) É necessário tomar cuidado para que um objeto não seja deletado enquanto ainda está sendo usado Por exemplo, uma função ingênua para remover um objeto do grafo, seria: está_no_grafo( objeto )? N Transform Transform S Transform 1 ref pai = objeto.pai; pai.remover( objeto ) 1 ref Geode 3 refs fim Principais Nós do OSG osg::Node osg::Group osg::LOD osg::Switch osg::Geode osg::Transform osg::Billboard osg::AutoTransform osg::MatrixTransform osg::PositionAttitudeTransform Montando um grafo apartamento sala quarto varanda parede cama cama chão chão parede mesa de jantar planta tampo cadeira cadeira Tipos de nós do OSG (Group e Geode) osg::Node osg::Group osg::LOD quarto osg::Geode cama cama chão parede (Quarto é formado por: camas, chão e paredes) osg::Transform (Classes herdam funcionalidades das classes de que derivam) osg::Group osg::Geode osg::Geode osg::Geode osg::Geode Tipos de nós do OSG (Transform) osg::Node osg::Group quarto osg::Geode cama osg::LOD cama osg::Transform (Classes herdam funcionalidades das classes de que derivam) osg::Group osg::Transform osg::Transform posição = (8, 3, 0) posição = (8, 4, 0) osg::Geode Hierarquia de Movimentos/Transformações Dedo Base Braço 1 Braço 2 Braço 3 Dedo Hierarquia de Movimentos/Transformações Grupo Base Transformação Transformação Transformação Transformação Braço 1 Braço 2 Braço 3 Dedo Dedo Montando Hierarquia no OSG osg::Group* group = new osg::Group(); group (osg::Group) osg::MatrixTransform* mt1 = new osg::MatrixTransform(); mt1 base (osg::MatrixTransform) (osg::Geode) mt1->setMatrix( matrix1 ); group->addChild( mt1 ); osg::MatrixTransform* mt2 = new osg::MatrixTransform(); mt2->setMatrix( matrix2 ); mt2 (osg::MatrixTransform) braco1 (osg::Geode) mt1->addChild( mt2 ); mt3 osg::MatrixTransform* mt3 = new osg::MatrixTransform(); mt3->setMatrix( matrix3 ); mt2->addChild( mt3 ); (osg::MatrixTransform) braco2 (osg::Geode) Tipos de nós do OSG (LOD) osg::Node quarto osg::Group osg::Geode cama hi osg::LOD cama med cama low osg::Transform (Classes herdam funcionalidades das classes de que derivam) osg::Group 5 a 10m osg::LOD osg::Geode osg::Geode osg::Geode Geode – Geometry Node Os Geodes contém uma lista de objetos desenháveis (Drawables) osg::Node osg::Geode 1 0..N osg::Drawable osg::ShapeDrawable osg::Geometry Drawable osg::Node É possível reimplementar a classe Drawable e fazer chamadas diretas ao OpenGL class MeuDrawable : public osg::Drawable osg::Geode 1 0..N { virtual void drawImplementation( RenderInfo& renderInfo ) const { glBegin( GL_LINES ); osg::Drawable glVertex3f( 0, 0, 0 ); glVertex3f( 0, 1, 0 ); glVertex3f( 1, 2, 0 ); glVertex3f( 3, 3, 0 ); osg::Geometry glVertex3f( 3, 3, 0 ); glVertex3f( 3, 4, 0 ); osg::ShapeDrawable glEnd(); } } Drawable osg::Node É possível atribuir formas geométricas a uma instância dessa classe: osg::Geode 1 0..N osg::Drawable osg::Geometry osg::ShapeDrawable Esfera Caixa Cone Cilindro Cápsula Plano Infinito Fecho Convexo Campo de Alturas Drawable osg::Node osg::Geode 1 0..N osg::Drawable osg::Geometry osg::ShapeDrawable É possível atribuir vértices, normais e faces a uma instância dessa classe Mais Exemplos Desenho com Normais em 3D (1/2) osg::Geometry* geometry = new osg::Geometry(); osg::Vec3Array& vertexArray = *new osg::Vec3Array( 8 ); geometry->setVertexArray( &vertexArray ); vertexArray[0] = osg::Vec3( 0, 0, 0 ); vertexArray[1] = osg::Vec3( 1, 0, 0 ); vertexArray[2] = osg::Vec3( 1, 1, 0 ); vertexArray[3] = osg::Vec3( 0, 1, 0 ); vertexArray[4] = osg::Vec3( 0, 0, 0 ); vertexArray[5] = osg::Vec3( 1, 0, 0 ); vertexArray[6] = osg::Vec3( 1, 0, -1 ); vertexArray[7] = osg::Vec3( 0, 0, -1 ); geometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 8 ) ); geoNode->addDrawable( geometry ); Desenho com Normais em 3D (2/2) osg::Geometry* geometry = new osg::Geometry(); osg::Vec3Array& vertexArray = *new osg::Vec3Array( 8 ); geometry->setVertexArray( &vertexArray ); osg::Vec3Array& normalArray = *new osg::Vec3Array( 8 ); geometry->setNormalArray( &normalArray ); geometry->setNormalBinding( osg::Geometry::BIND_PER_VERTEX ); vertexArray[0] = osg::Vec3( 0, 0, 0 ); normalArray[0] = osg::Vec3( 0, 0, 1 ); vertexArray[1] = osg::Vec3( 1, 0, 0 ); normalArray[1] = osg::Vec3( 0, 0, 1 ); vertexArray[2] = osg::Vec3( 1, 1, 0 ); normalArray[2] = osg::Vec3( 0, 0, 1 ); vertexArray[3] = osg::Vec3( 0, 1, 0 ); normalArray[3] = osg::Vec3( 0, 0, 1 ); vertexArray[4] = osg::Vec3( 0, 0, 0 ); normalArray[4] = osg::Vec3( 0, -1, 0 ); vertexArray[5] = osg::Vec3( 1, 0, 0 ); normalArray[5] = osg::Vec3( 0, -1, 0 ); vertexArray[6] = osg::Vec3( 1, 0, -1 ); normalArray[6] = osg::Vec3( 0, -1, 0 ); vertexArray[7] = osg::Vec3( 0, 0, -1 ); normalArray[7] = osg::Vec3( 0, -1, 0 ); geometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUADS, 0, 8 ) ); geoNode->addDrawable( geometry ); Cores por Vértice Cada vértice da geometria também pode ser associado a uma cor diferente Essa cor pode ser associada à cor final do objeto material->setColorMode( osg::Material:: AMBIENT_AND_DIFFUSE ); O vetor de cores é associado ao Geometry com o método setColorArray() Usando Índices (1/2) Na prática, mesmo com strips, boa parte dos objetos desenhados exige que um vértice seja enviado à placa repetidas vezes Se um grid 170x80 fosse enviado à GPU usando um DrawArrays de TRIANGLE_STRIPS ou QUAD_STRIPS, usaria 2x171x80x12 = 348 kbytes As placas gráficas aceitam que a ordem de criação das faces seja definida com índices, que referenciam posições no vetor de vértices Usando índices, esse mesmo grid poderia ser enviado à GPU usando 171x81x12 + 2x171x80x4 = 276 kbytes (20% menos) Usando Índices (2/2) osg::Geometry* geometry = new osg::Geometry(); unsigned int indices[6]; indices[0] = 0; osg::Vec3Array& vertexArray = *new osg::Vec3Array( 9 ); indices[1] = 3; vertexArray[0] = osg::Vec3( 0, 0, 0 ); indices[2] = 1; vertexArray[1] = osg::Vec3( 1, 0, 0 ); indices[3] = 4; vertexArray[2] = osg::Vec3( 2, 0, 0 ); indices[4] = 2; vertexArray[3] = osg::Vec3( 0, 1, 0 ); indices[5] = 5; vertexArray[4] = osg::Vec3( 1, 1, 0 ); geometry->addPrimitiveSet( new osg::DrawElementsUInt( osg::PrimitiveSet::QUAD_STRIP, 6, indices ) ); vertexArray[5] = osg::Vec3( 2, 1, 0 ); vertexArray[6] = osg::Vec3( 0, 2, 0 ); vertexArray[7] = osg::Vec3( 1, 2, 0 ); vertexArray[8] = osg::Vec3( 2, 2, 0 ); geometry->setVertexArray( &vertexArray ); indices[0] = 3; indices[1] = 6; indices[2] = 4; indices[3] = 7; indices[4] = 5; indices[5] = 8; geometry->addPrimitiveSet( new osg::DrawElementsUInt( osg::PrimitiveSet::QUAD_STRIP, 6, indices ) ); Estados de Rendering A aparência da geometria renderizada no OpenGL pode ser modificada através da manipulação dos estados de rendering do OpenGL Estados de rendering permitem controlar: Iluminação Texturas Planos de recorte Névoa Combinação de texturas transparentes Renderização com pontos, linhas ou preenchimento etc... Aplicando Neblina No OSG: void aplicarNeblina( osg::Node* node ) { osg::StateSet* stateset = new osg::StateSet(); stateset->setMode( GL_FOG, osg::StateAttribute::ON ); node->setStateSet( stateset ); } No OpenGL: void desenharCenaComNeblina() { glEnable( GL_FOG ); desenhar_trechos_da_cena_com_fog(); glDisable( GL_FOG ); } Aplicando Materiais #include <osg/Material> void aplicarMaterial( osg::Node* node ) { osg::StateSet* stateset = new osg::StateSet(); node->setStateSet( stateset ); osg::Material* material = new osg::Material(); material->setAmbient( osg::Material::FRONT_AND_BACK, osg::Vec4( 0, 0.5, 0, 1 ) ); material->setDiffuse( osg::Material::FRONT_AND_BACK, osg::Vec4( 0, 1, 0, 1 ) ); material->setSpecular( osg::Material::FRONT_AND_BACK, osg::Vec4( 1, 1, 1, 1 ) ); stateset->setAttributeAndModes( material, osg::StateAttribute::ON ); } Aplicando Texturas osg::StateSet* stateset = new osg::StateSet(); node->setStateSet( stateset ); osg::Image* image = osgDB::readImageFile( "c:/temp/madeira.png" ); osg::Texture2D* texture = new osg::Texture2D( image ); texture->setFilter( osg::Texture::MAG_FILTER, osg::Texture::LINEAR ); texture->setFilter( osg::Texture::MIN_FILTER, osg::Texture::LINEAR ); texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT ); texture->setWrap( osg::Texture::WRAP_T, osg::Texture::REPEAT ); stateset->setTextureAttributeAndModes( 0, texture, osg::StateAttribute::ON ); Textura Uma textura pode ser uma imagem 1D, 2D ou 3D Para que seja corretamente aplicada em um objeto, cada um de seus vértices devem ter coordenadas de textura (Texture Coordinates) Coordenadas de textura podem ser aplicadas para cada vértice ou usando uma equação (ver osg::TexGen ou glTexGen()) 0 0 1 2 2.2 1 2 (1;1) (2;1) 3 (3;1) 3.8 Desenho com Textura osg::Geode* geoNode = new osg::Geode(); osg::Vec3Array& vertexArray = *new osg::Vec3Array( 4 ); vertexArray[0] = osg::Vec3( 0, 0, 0 ); vertexArray[1] = osg::Vec3( 0, 1, 0 ); vertexArray[2] = osg::Vec3( 1, 0, 0 ); vertexArray[3] = osg::Vec3( 1, 1, 0 ); osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 ); tex0Array[0] = osg::Vec2( 0, 0 ); tex0Array[1] = osg::Vec2( 0, 1 ); tex0Array[2] = osg::Vec2( 1, 0 ); tex0Array[3] = osg::Vec2( 1, 1 ); osg::Image* image = osgDB::readImageFile( "C:/temp/brick yellow.jpg" ); osg::Texture2D* texture = new osg::Texture2D( image ); texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT ); texture->setWrap( osg::Texture::WRAP_T, osg::Texture::REPEAT ); osg::StateSet* stateset = new osg::StateSet(); stateset->setTextureAttributeAndModes( 0, texture ); osg::Geometry* geometry = new osg::Geometry(); geometry->setVertexArray( &vertexArray ); geometry->setTexCoordArray( 0, &tex0Array ); geometry->setStateSet( stateset ); geometry->addPrimitiveSet( new osg::DrawArrays( osg::PrimitiveSet::QUAD_STRIP, 0, 4 ) ); geoNode->addDrawable( geometry ); Desenho com textura (Wrap) (1/3) É necessário definir como a textura se comportará fora do intervalo [0..1] de coordenadas de textura Existem 5 modos: CLAMP CLAMP_TO_EDGE CLAMP_TO_BORDER REPEAT MIRROR Desenho com textura (Wrap) (2/3) osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 ); tex0Array[0] = osg::Vec2( 0, 0 ); tex0Array[1] = osg::Vec2( 0, 1 ); tex0Array[2] = osg::Vec2( 1, 0 ); tex0Array[3] = osg::Vec2( 1, 1 ); osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 ); tex0Array[0] = osg::Vec2( 0, 0 ); tex0Array[1] = osg::Vec2( 0, 1 ); tex0Array[2] = osg::Vec2( 4, 0 ); tex0Array[3] = osg::Vec2( 4, 1 ); texture->setWrap( osg::Texture::WRAP_S, osg::Texture::REPEAT ); Desenho com textura (Wrap) (3/3) osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 ); tex0Array[0] = osg::Vec2( -0.5, -0.5 ); tex0Array[1] = osg::Vec2( -0.5, 1.5 ); tex0Array[2] = osg::Vec2( 1.5, -0.5 ); tex0Array[3] = osg::Vec2( 1.5, 1.5 ); texture->setWrap( osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_BORDER ); texture->setWrap( osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_BORDER ); texture->setBorderColor( osg::Vec4( 0, 0, 0, 1 ) ); osg::Vec2Array& tex0Array = *new osg::Vec2Array( 4 ); tex0Array[0] = osg::Vec2( -0.5, -0.5 ); tex0Array[1] = osg::Vec2( -0.5, 1.5 ); tex0Array[2] = osg::Vec2( 1.5, -0.5 ); tex0Array[3] = osg::Vec2( 1.5, 1.5 ); texture->setWrap( osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE ); texture->setWrap( osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE ); Câmera Como configurar a câmera no OSG? O posicionamento da câmera é feito pela matriz de View (que no OpenGL, é unida à matriz ModelView) Parâmetros: Posição dos olhos Direção de visualização Direção de Up A projeção da cena na tela é feita pela matriz de Projection Parâmetros: Abertura Z-Near e Z-Far Razão de Aspecto (Aspect Ratio) Configurando a Matriz de View No OSG: osg::Matrix matrix = osg::Matrix::lookAt( osg::Vec3( -10, -10, 10 ), osg::Vec3( 0, 0, 0 ), osg::Vec3( 0, 0, 1 ) ); viewer.getCamera()->setViewMatrix( matrix ); No OpenGL: glMatrixMode( GL_MODELVIEW ); glLoadIdentity(); gluLookAt( -10, -10, -10, 0, 0, 0, 0, 0, 1 ); Configurando a Matriz de Projection No OSG: osg::Matrix matrix = osg::Matrix::perspective( 45, 1.3, 0.1, 1000 ); viewer.getCamera()->setProjectionMatrix( matrix ); No OpenGL: glMatrixMode( GL_PROJECTION ); glLoadIdentity(); gluPerspective( 45, 1.3, 0.1, 1000 ); Etapas de Desenho Etapas de desenho do OSG Event Nesta etapa, os eventos gerados durante o quadro anterior são processados Tipos de eventos: Teclado Mouse Resize das janelas Eventos de teclado Fechamento Update Cull Draw e mouse GPU Geram atualizações no estado da cena Etapas de desenho do OSG Event Nesta etapa, o grafo de cena é atualizado Durante as etapas seguintes, este estará sendo desenhado e não poderá ser modificado Update Cull Draw Simulação física Animações Atualizações no estado da cena GPU Etapas de desenho do OSG Event Nesta etapa, todos os objetos a serem desenhados são coletados durante um caminhamento pelo grafo de cena Esta etapa pode ser realizada em diferentes processadores Update Estes 3 objetos estão fora do volume de visão, então não serão desenhados Cull Draw GPU Este objeto está distante, uma versão de menor resolução poderá ser usada Etapas de desenho do OSG Event Nesta etapa, todos os objetos coletados são ordenados e enviados à placa 3D Eles podem ser ordenados por estado OpenGL (aparência) ou de acordo com sua distância à câmera Update Cull Ordenação por estados Draw GPU Ordenação Existem diversas ordens possíveis para desenhar os objetos da cena Do mais distante ao mais próximo (necessário para objetos transparentes) Do mais próximo ao mais distante (útil para objetos com shaders complexos) Ordenandos por estados similares (default do OSG) Imagine uma cena composta por 1000 guerreiros com calça azul e camisa branca Desenhar sem ordenação por estado implica em 1998 trocas de estado desnecessárias Material azul > desenhar > material branco > desenhar > material azul > desenhar ... Ordenação – Do fundo à frente α = 50% cor= α = 50% cor= α = 50% cor= α = 50% cor= A-Buffer contém uma lista de superfícies que compõem um determinado pixel Ordenação – Do fundo à frente Esferas desenhadas do fundo para a frente 1 2 3 4 Esferas desenhadas em ordem aleatória 2 3 1 4 Etapas de desenho do OSG Event Nesta etapa, placa 3D desenha a geometria recebida A geometria não é renderizada imediatamente Pode ficar por algum tempo em uma fila de renderização Update Cull Draw GPU Etapas de desenho do OSG Event – Processamento de eventos (teclado, mouse, ...) Update – Atualização do grafo Cull – Seleção de geometria visível Draw – Ordenação e envio à placa GPU – Tempo de desenho na GPU (draw gpu) Etapas de desenho do OSG