<< Voltar Índice Próxima >>

SHADOWNS E LIGHTS

Shadows

As sombras(shadows) são um elemento que aumenta o realismos dos ambientes 3D, mas que consequentemente aumenta o processamento gráfico. Em jogos com grande qualidade gráfica, que são executados em computadores sem uma placa de vídeo de boa qualidade, o jogo trava constantemente. Com isso normalmente o primeiro item retirado do jogo são exatamente as sombras, o que frequentemente melhora os frames por segundo do jogo, caso contrário é melhor comprar uma placa de vídeo mais nova.

A Ogre possui 3 tipos básicos de sombra:

Modulative Texture Shadows (SHADOWTYPE_TEXTURE_MODULATIVE): é a mais simples, as sombras criadas não possui muita precisão, sendo um pouco "borradas".

Modulative Stencil Shadows (SHADOWTYPE_STENCIL_MODULATIVE): possui uma ótima qualidade na criação das sombras, bem mais definidas. É um meio termo dos tipos de sombras da Ogre, por isso é indicada para jogos em que a jogabilidade não deva ser prejudicada por travamentos durante o game, como em jogos FPS.

Additive Stencil Shadows (SHADOWTYPE_STENCIL_ADDITIVE): é a melhor dos três tipos, mas precisa de um maior processamento pois a criação das sombras é verificada para cada luz(light) da cena separadamente.

Uma melhor comparação de cada uma das sombras criadas, é melhor vista no exemplo que vem juntamente com a Ogre, o Demo_Shadows.

    //cor da luz da cena
    scene_mgr->setAmbientLight(ColourValue(0,0,0));		
    //técnica de sombra
    scene_mgr->setShadowTechnique(SHADOWTYPE_STENCIL_ADDITIVE);

    return true;
}

 

Vá até o arquivo "Inicializa.cpp" e no final do método "Configura()" chame a função setAmbienteLight() e retire a luz do ambinte, como no código acima. O sistema de cor é do tipo RGB, variando de zero a um, onde o primeiro parâmetro é a cor vermelha, o segundo verde e o terceiro azul. Dessa forma a cena terá influência apenas das luzes a serem criadas

Com função "setShadowTechinique()" é definido o tipo de sombra a ser utilizado na cena, será utilizado o tipo Additive Stencil Shadow.

Uma pequena cena será montada para exemplificar o uso de luzes e sombras, adicionamos um pequeno plano que será o chão no método "CarregaMalhas()".

    Plane plane(Vector3::UNIT_Y, 0);

    MeshManager::getSingleton().createPlane("ground",
       ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
       1500,1500,20,20,true,1,5,5,Vector3::UNIT_Z);

 

O método que inicializa o plano tem como primeiro parâmetro o eixo para qual o plano ficará voltado, ou seja, sua orientação. No código acima, como o plano será um chão, a sua "frente" ficará para o eixo Y positivo. O segundo parâmetro em outras palavras, é a distância que o plano deve estar da origem.

O MeshManager guarda as informações de todas as malhas que existem no jogo, pode ser utilizado para separar-las em grupos. Utilizando esse recurso adicionaremos o plano para nosso game. O primeiro parâmetro do método "createPlane()" é o nome que será usado para acessar a malha futuramente, o segundo é o grupo a qual ele estará, no código acima ele está no padrão(DEFAULT_RESOURCE_GROUP_NAME). O terceiro é a Orientação, o quarto a largura, o quinto parâmetro a altura. O sexto e sétimo definem a quantidade de segmentos que o plano terá nas direções X e Y respectivamente, quanto maior o número de divisões melhor a qualidade da textura. Para mais informações de createPlane visite a API da Ogre.

    Entity *entPlano = scene_mgr->createEntity("chao","ground");
    SceneNode *nodePlano = scene_mgr->getRootSceneNode()->createChildSceneNode("chaoNode");
    nodePlano->attachObject(entPlano);

 

No trecho acima criamos para o chão uma Entity e anexamos um SceneNode para que ele apareça na cena.

    entPlano->setMaterialName("Examples/Rockwall");
    ent1->setCastShadows(true);

 

Com "setMaterialName()" define-se o material, a textura que será aplicada no chão. Esse material está definido no script Example.material. A função "setCastShadows()" determina se o robô(ent1) terá sombra ou não.

Lights

Um outro elemento importante no jogos são as luzes(lights), podem ajudar criar um ambiente muito sombrio como em Silent Hill ou esconder itens na ausência delas. A Ogre possui tres tipos básicos:

Point (LT_POINT): cria uma luz que ilumina em todas as direções.

Spotlight (LT_SPOTLIGHT): esse tipo cria uma luz como a de uma lanterna.

Directional (LT_DIRECTIONAL): cria uma luz em uma direção que ilumina uma grande área, como se fosse a luz do sol ou da lua.

    Light *light = scene_mgr->createLight("Light1");
    light->setType(Light::LT_POINT);
    light->setPosition(Vector3(-50, 150, -100));

 

Uma light é criada utilizando a função "createLight()" através do SceneManager, a string passada como parâmetro é o seu nome de identificação, assim como em um SceneNode. O método "setType()" define o tipo de luz a ser criada, inicialmente ela é do tipo Point.

    light->setDiffuseColour(0.0, 0.0, 1.0);
    light->setSpecularColour(0.0, 0.0, 1.0);

 

As duas funções do código acima atribuem duas características importantes da luz, a sua cor. Usando "setDiffuseColour()" define-se a cor da reflexão difusa, que é a predominante, e com "setSpecularColour()" a cor da reflexão especular. No trecho de código acima a light tem cor azul.

Antes de compilar e observar como está a cena, modifique a posição da câmera para que ela não inicie na mesma altura que o plano(chão). Para isso defina uma altura maior que 25 por exemplo, como no trecho de código abaixo que deve ser acrescentado no método "Configura()".

    camera->setPosition(0,25,0);

 

Se tudo estiver correto, uma cena como na figura acima irá aparecer. Use as letras(QWEASD) para movimentação na cena.

    light = scene_mgr->createLight("Light2"); 
    light->setType(Light::LT_DIRECTIONAL);
    light->setDiffuseColour(ColourValue(1.0, 0.0, 0));
    light->setSpecularColour(ColourValue(1.0, 0.0, 0));

    light->setDirection(Vector3( 0, -1, 1 ));

 

Uma segunda luz é criada do tipo Directional, com a cor vermelha. A função "setDirection()" indica a direção a qual a luz terá. No trecho acima ela virá de cima para baixo(-1), eixo negativo de Y, e do fundo da cena para a tela(1), eixo positivo de Z.

    light = scene_mgr->createLight("Light3"); 
    light->setType(Light::LT_SPOTLIGHT);
    light->setDiffuseColour(0.0, 1.0, 0.0);
    light->setSpecularColour(0.0, 1.0, 0.0);

    light->setDirection(-1, -1, 0);
    light->setPosition(Vector3(100, 150, -200));	

    light->setSpotlightRange(Degree(70), Degree(150));

 

A terceira luz criada é do tipo Spotilight com cor verde. O método "setSpotlightRange()" deterimina o tamanho da circunferência em graus(Degree) ou radiano(Radian) da fonte de luz no primeiro parâmetro, como se fosse a lanterna. E o tamanho da circunferência da luz onde ela ilumina no segundo parâmetro. Observe a figura abaixo.

Italo Mendes
italo.ribeiro@gmail.com

<< Voltar Índice Próxima >>