3. Geração do Terreno
3.4. Nível de Detalhe
3.4.4. Problemas
3.4.4.2. Popping
O efeito de popping é uma consequência directa da mudança de nível de detalhe que ocorre na representação de um objecto. Essa mudança tem um impacto visual bastante perceptível que não contribui em nada para o realismo da cena. Assim, com o intuito de minimizar este efeito, recorre-se normalmente a um de dois métodos [119]: o alpha
blending ou o Geomorphing. O alpha blending procura tornar a transição entre dois
níveis de detalhe menos perceptível, associando um valor de opacidade ou valor alpha a cada um deles. Este valor vai de 1.0, para o qual o objecto é opaco, a 0.0, no qual o objecto é invisível. O objectivo é estabelecer para cada objecto uma zona de transição que tem como centro o ponto de mudança do nível de detalhe. Por exemplo, se existe uma mudança aos 100 metros e a zona de transição tem 10 metros, o alpha blending ocorre entre os 95 e os 105 metros. Nesse intervalo é feito o rendering simultâneo dos dois níveis de detalhe. Assim, no caso de uma mudança de um nível de detalhe mais alto para um nível mais baixo, que para efeitos de exemplo são aqui referidos como LOD1 e LOD2 respectivamente, aos 95 metros ocorre o rendering do LOD1 com 1.0 de opacidade e do LOD2 com 0.0 de opacidade. À medida que o ponto de vista se vai afastando a opacidade do LOD1, diminui progressivamente e a do LOD2 aumenta, até que o LOD1 desaparece sendo substituído pelo LOD2. Este conceito é exemplificado na Figura 3-40, onde é efectuada uma transição entre um nível de detalhe representado por um bloco de terreno com 3 vértices para um nível de detalhe com 2 vértices. A principal desvantagem deste método é o facto de durante o período de transição ser necessário efectuar o rendering dos dois objectos, o que tem como consequência um aumento dos triângulos, podendo isso ser problemático na medida em que a mudança do nível de detalhe deve-se precisamente à necessidade de reduzir o número de triângulos. Assim convém que a zona de transição neste método seja a mais curta possível para que se possa tirar partido da mudança de nível de detalhe em relação ao número de triângulos enviados para rendering.
Figura 3-40: Alpha Blending.
O alpha blending actua no espaço da imagem enquanto que o Geomorphing actua a nível geométrico executando o morphing dos vértices de um nível de detalhe para outro. É por isso muitas vezes designado de vertex morphing. O objectivo é interpolar a posição dos vértices a modificar de um nível de detalhe para outro de modo a que se torne praticamente imperceptível a mudança e, consequentemente, seja possível eliminar o efeito de popping. Esta estratégia não implica ao contrário do alpha blending a introdução de mais geometria, é no entanto necessário modificar a posição dos vértices. Este processo é ilustrado na Figura 3-41 onde a posição do vértice vai sendo modificada de frame para frame com o seu valor interpolado linearmente entre a sua posição inicial e final, ou seja, da esquerda para a direita na figura. A nível dos terrenos a forma como esta técnica é aplicada depende muito da implementação adoptada em cada um dos algoritmos pelo que as diferentes aproximações são descritas no contexto dos algoritmos correspondentes (ver 4). No entanto, vale a pena referir que na grande maioria dos casos é efectuada ao nível da componente programável da placa gráfica, mais precisamente ao nível do vertex shader para a geometria e ao nível do pixel shader para as texturas associadas. Outro factor relevante é se no momento em que ocorre o morphing este é feito de forma independente para cada um dos blocos de terreno ou se pelo contrário é feito tendo em consideração os blocos vizinhos. Esta última forma de aplicar o Geomorphing é abordada em detalhe no contexto do algoritmo de Geomipmapping (ver 4.4)
Figura 3-41: Geomorphing [162].
3.5. Sumário
O objectivo deste capítulo foi abordar em detalhe o processo de geração do terreno, nomeadamente, a construção da geometria e os diferentes métodos utilizados para reduzir o número de triângulos a enviar para rendering. No que diz respeito à construção da geometria (ver 3.1), discutiu-se em detalhe os diferentes tipos de primitivas que podem ser utilizados, mais especificamente as listas de triângulos (ver 3.1.1), os leques de triângulos (ver 3.1.2) e as tiras de triângulos (ver 3.1.3), tendo sido posteriormente expostas as diferenças que existem entre eles, bem como quais os mais utilizados na geração de terrenos em tempo real. Desta análise conclui-se que as melhores são as listas
e as tiras de triângulos em grande parte por permitirem efectuar o menor número de chamadas tendo consequentemente um melhor desempenho.
Em relação aos métodos utilizados na redução da geometria, a maioria deles está dependente de estruturas de dados espaciais (ver 3.2). Estas permitem efectuar o particionamento dos diferentes objectos que constituem a cena e no caso especifico dos terrenos permitem a partição do terreno em múltiplos blocos e consequentemente o remover ou o diminuir do número de triângulos necessários por bloco. Para que a partição espacial seja menos complexa, cada um dos objectos é representado por um
bounding volume (ver 3.2.1) que delimita a área que ocupa e que permite que se actue
não ao nível do objecto propriamente dito, mas sobre uma representação deste inerentemente mais simples, por exemplo sobre uma axis aligned bounding box (AABB) ou uma bounding sphere (BS). Estes bounding volumes estão organizados nas estruturas de dados espaciais numa hierarquia que estabelece as relações entre eles, tendo-se abordado dois tipos de hierarquias: as bounding volume hierarchies (ver 3.2.2) e as
spatial partitioning hierarchies (ver 3.2.3). As spatial partitioning hierarchies são
especialmente relevantes dado que são as estruturas de dados espaciais de particionamento hierárquico mais utilizadas na geração de terrenos em tempo real. Algumas das estruturas mais importantes deste grupo são as quadtrees (ver 3.2.3.1), as
octrees (ver 3.2.3.2) e as triangle bintrees (ver 3.2.3.3), algumas delas com um papel
importante não só na partição espacial dos terrenos, mas também no processo de triangulação propriamente dito, como é o caso das quadtrees e das triangle bintrees.
Utilizando como base as estruturas espaciais de particionamento abordaram-se de seguida as duas principais formas de reduzir o número de triângulos enviados para
rendering: o culling (ver 3.3) e a redução do nível de detalhe (ver 3.4). No que diz
respeito ao culling, o objectivo é remover os objectos que não contribuem para a cena isto é, aqueles que não vão ser visualizados e que não necessitam por isso de serem processados. O back-face culling (ver 3.3.1), o view frustum culling (ver 3.3.2) e o
occlusion culling (ver 3.3.3) foram os tipos de culling discutidos destacando-se o view frustum culling e o occlusion culling. O primeiro porque de uma forma simples permite
remover uma grande quantidade de geometria, apoiando-se para isso nos métodos de partição espacial já aqui discutidos, o segundo porque permite a remoção de objectos ocultos por outros objectos, existindo inclusive um conjunto de algoritmos (ver 3.3.4) especialmente adaptados para resolver esse problema.
Finalmente, discutiram-se as técnicas de nível de detalhe (ver 3.4), nomeadamente os diferentes tipos de nível de detalhe (ver 3.4.1): o discreto (ver 3.4.1.1), o contínuo (ver 3.4.1.2), o dependente do ponto de vista (ver 3.4.1.3) e o hierárquico (ver 3.4.1.4). Destes o mais relevante para gestão do nível de detalhe em terrenos é o dependente do ponto de vista dado que implica a selecção dinâmica do nível de detalhe mais apropriado para a visão corrente do utilizador, bem como uma simplificação diferente em partes distintas do terreno, o que mais uma vez é conseguido graças aos métodos de partição espacial aqui discutidos. Foram ainda abordados tópicos como os métodos de simplificação (ver 3.4.2) e a forma como o nível de detalhe é seleccionado (ver 3.4.3) para cada objecto. Por fim foram discutidos os problemas resultantes de técnicas de nível de detalhe (ver 3.4.4) com especial ênfase nos terrenos e em dois problemas principais: as falhas/t-junctions (ver 3.4.4.1) e o popping (ver 3.4.4.2).