From BlenderWiki

Jump to: navigation, search
Blender3D FreeTip.gif
IMPORTANT! Do not update this page!
We have moved the Blender User Manual to a new location. Please do not update this page, as it will be locked soon.

Objeto tipo "Occluder" (Oclusor)

Occluder

O Objeto tipo "Occluder" (Oclusor) evita que os Objetos que estão atrás de si sejam enviados para a renderização da GPU, para manter a performance de renderização da BGE. (veja Notas de Lançamento sobre a Oclusão de Abate/Colisão (Occlusion Culling))

Objetos do tipo "Invisible" (Invisível)

Caso o Objeto tenha sido configurado como "Invisible" (Invisível), ele não é renderizadona BGE ou Máquina de Jogos do Blender (Blender Game Engine).

Especificações Técnicas

(Redigida a partir das Notas de Lançamento do Blender 2.49)

Visualização do Frustrum (Ambiente espacial definido) de abate

A Árvore dinâmica de Volume por área Circundante ou área Abrangente ou Dynamic Bounding Volume Tree (DBVT) (em inglês) montada pela fábrica de filtragem de ampla fase da biblioteca de física "Bullet" (Bala), é utilizada para construir uma árvore de Objetos gráficos dentro da "Scene" (Cena) na BGE. Os elementos da árvore são caixas do tipo Caixas Abrangentes ou Circundantes Alinhadas, ou Aabb (Aligned Axis Bounding Boxes) (em inglês), que englobam os Objetos. Isto provê uma boa precisão dentro de "Scenes" (Cenas) fechadas ou abertas. Este novo sistema para detecção de colisão e abate (culling) é habilitado por padrão, mas somente para alguns casos, ele também pode ser desabilitado com um botão dentro das configurações de ambiente do Blender (World).

Com estas melhorias, a parte de detecção de colisões ou abate e a parte de "Scenegraph" (Gráficos de Cena ) da BGE ou Máquina de Jogos do Blender, chega a ser 5 vezes mais rápida do que por exemplo na versão 2.48 e anteriores. Contudo, esta melhoria de velocidade somente é perceptível quando você possui muitos Objetos na Cena (>100).

Oclusão da detecção de abates ou colisão

A "Occlusion culling" (Oclusão de detecção de abates ou colisão), é a habilidade que certos Objetos (os Oclusores) possuem de esconder outros Objetos (Ex: não enviá-los para a GPU para serem renderizados). Bem como opção de visão de abate do frustrum que engloba os Objetos, a implementação é baseada nas Árvores Dinâmicas de Volume que circundam/abrangem o volume dos Objetos, pela biblioteca "Bullet" (Bala).

A Oclusão de detecção de abates/colisões não está habilitada por padrão por que é uma funcionalidade que requer um certo grau de entendimento para oferecer os melhores benefícios. Caos ela não seja utilizada de maneira apropriada, ela simplesmente vai fazer com que o jogo se torne mais elnto, ao invés de colaborar. (Ainda assim, nem tanto, pelo fato do processamento da Oclusão ser auto-regulado.)

Como isso Funciona ?

A Oclusão de detecção de abate/colisão é ativada quando você define pelo menos um Objeto do tipo "Ocluder" (Oclusort) dentro de sua "Scene" (Cena). A Opçãod e utilização de Objetos tipo "Occluder" (Oclusão) está dentro dos botões "Physic" (Física):

Dev-GameEngine-occlusion-button.png


A Opção "Occluder" (Oclusor) somente pode ser utilizada em Objetos tipo Malha. Conforme a parte de calculação Física se torna avisada destes Objetos, temos uma equivalência com a opção "No collision" (Sem Colisão)   A Razão pela qual eu escolhi fazer com que o modo de "Occluder" (Oclusor) fosse mutuamente exclusivo com outros modos de calculação física é para enfatizar o fato de que Objetos tipo "Occluders" (Oclusores) devem ser especificamente desenhados para esta finalidade e não é qualquer tipo de Malha que pode ser especificada como um "Occluder" (Oclusor). Contudo, você pode habilitar a capacidade de Oclusão em Objetos Físicos através da utilização de Scripts Python e "Logic Bricks" (Blocos Lógicos). Nós vamos chegar nisso.

Quando um Objeto do tipo "occluder" (oclusor) entra dentro da visualização do frustrum. A BGE constrói um buffer de profundidade (ZDepht) a partir das faces daquele Objeto. O fato das faces do Objeto serem do tipo "Single-Side" (Lado Único) ou "Two-Side" (Dois lados) é importante: somente as faces frontais ou as faces de dois lados (ou seja, normal em ambos os lados ou a direção das normais ) são utilizadas para a construção do buffer de profundidade (ZDepth) buffer. Caso múltiplos Objetos "Occluders" (Oclusores) estejam dentro da visão do frustrum, a BGE os combina e mantém as faces que estão mais a frente.

A resolução do buffer de profundidade (Zdepth) é controlável dentro das configurações do "World" (Ambient) com o botão marcado "Occlu Res":

Dev-GameEngine-occlusion-resolution.png

Por padrão, a resolução é de 128 pixels para a mais larga dimensão da "viewport" (porta de visão) enquanto a resolução da outra dimensão é configurada de maneira proporcional. Ainda que 128 seja considerado uma resolução baixa, ele é suficiente para a finalidade de "culling" (colisão/abate). A resolução pode ser aumentada para no máximo 1024, mas a um custo de processamento e uso de CPU  bem grande.

A BGE translada a árvore DBVT e para cada nó, ela executa uma checagem para saber se se ele está integralmente escondido pelos Objetos tipo "Occluders" (Oclusores) e caso esteja, ela abate/colide o nó (e todos os Objetos que ele contém).

Para uma otimização futura da funcionalidade, as versões e construções da BGE a partir deste momento utilizam o buffer ZDepth somente quando pelo menos um Objeto tipo "Occluder" (Oclusor) está dentro do frustrum de visualização. Até esse momento, não há uma perda de performance comparável em relação ao frustrum de abate/colisão regular.

Como utilizar isso

Existem situações aonde o abate/colisão pode oclusão não irá trazer nenhum benefício:

  • Caso os Objetos tipo "Occluders" (Oclusores) sejam pequenos e não escondam muitos Objetos.
    Neste caso, o abate/colisão de Oclusão não estará fazendo nada a não ser comer o poder de processamento de sua CPU piorando o desempenho.
  • Caso os Objetos do tipo "Occluders" (Oclusores) sejam grandes, mas escondam Objetos muitos simples.
    Neste caso, é melhor enviar os Objetos diretamente para a GPU.
  • Caso os Objetos tipo "Ocluders" (Oclusores) sejam grande e escondam muitos Objetos complexos, mas dentro de uma maneira bem previsível.
    Exemplo: uma casa cheia de Objetos complexos. Ainda que o Sistema de Oclusão de abate/colisão tenha uma performance satisfatória para este caso, você irá obter uma melhor performance através da implementação de uma lógica específica que esconda/revele os Objetos na sua "Scene" (Cena); por instância, isto significa fazer com que os Objetos estejam visíveis somente quando a câmera entra na casa.

O sistema de "Occlusion Culling" (Oclusão de Abate/Colisão) faz mais sentido quando os Objetos Oclusores são grandes (construções, montanhas, ...) que escondam muitos Objetos complexos de uma maneira imprevisível. Contudo, não fique muito preocupado com a performance: mesmo que você o utilize inapropriadamente, a perda de performance relativa será limitada pelo fato da estrutura do algoritmo se auto-ajustar.

Objetos tipo "Occluder" (Oclusores) podem ser Objetos graficamente visíveis mas esteja avisado que a utilização de muitas faces irá fazer com que a criação do buffer de profundidade Z (Zdepht) pode ficar bem lenta. Por exemplo, um terreno não é um candidato tão bom para a oclusão: normalmente estes possuem muitas faces e muitas sobreposições. Os Objetos do tipo "Occluders" (Oclusores) podem ser Objetos invisíveis colocados dentro de Objetos mais complexos (Por exemplo: "dentro das paredes" de uma construção com uma arquitetura complexa). Os Objetos tipo "Occluders" (Oclusores) podem possuir "orifícios" através dos quais você poderá ver os Objetos.

Aqui apresentamos um "workflow" (ciclo de trabalho) para criar Objetos tipo "Occluder" (Oclusor) a partir de um terreno complexo:

  • Dupliqueo Terreno e faça um modelo com "low poly" (poucos polígonos)
  • Remova todas as partes horizontais e mantenha somente as partes com alta elevação.
  • Faça com que todas as faces sejam invisíveis e configure a Malha para o Modo "Occluder" (Oclusor).

Para otimizar mais ainda, você pode dividir o Objeto tipo "Occluder" (Oclusor) em muitos Objetos ( perfazendo um Oclusor para cada montanha, cada parede, etc.) e fazer o mesmo para o terreno: desta maneira, partes do terreno que estão atrás/sob os oclusores não serão renderizados.

Você pode verificar como a oclusão está funcionando rodando o jogo em modo de "wireframe" (aramado).

Controle In-game ( Dentro do Jogo)

Você pode ligar/desligar a capacidade de Oclusão de um Objetos através de Scripts Python com as seguintes linhas de programação:

obj.occlusion = True
obj.setOcclusion(True, False)    #param1=occlusion, param2=recurse in children


O Objeto não necessita estar definido como um Objeto tipo "Occluder" (Oclusor) dentro da GUI (Interface de Usuário) do Blender: você pode habilitar a capacidade de oclusão em qualquer Objeto de Malha, incluindo Objetos definidos como "static" (estáticos) e "dynamic" (dinâmicos) durante o Jogo.

Você também pode fazer a utilização do Atuador "Visibility" (Visibilidade):
Dev-GameEngine-occlusion-brick.png


Note que o layout do atuador foi alterado: Os botões mutuamente exclusivos para as opções "Visible/Invisible" (Visível/Invisível) foram substituídos por dois botões independentes: pressione o botão para ativar a funcionalidade → Visível e Oclusor (Visible/Occluding), e deixe sem pressionar para ativar a funcionalidade oposta, ou seja → Invisível e Não Oclusor (Invisible/Non-occluding).

Note que o Atuador configura o modo de Visibilidade e Oclusão ao mesmo tempo. Caso você necessite configurá-los separadamente, utilize um Script Python.

Limitações conhecidas

  • Caso você esteja utilizando a funcionalidade de "occlusion culling" (oclusão de abate/colisão), você deverá possuir pelo menos um Objeto do tipo "Occluder" (Oclusor) no início do Jogo. O Objeto tipo "occluder" (oclusor) não necessita estar dentro do/a "layer" (camada) ativa. Após isso, você pode habilitar e desabilitar a capacidade de oclusão em quaisquer dos Objetos de Malha durante o Jogo com a utilização dos controles In-Game ou Durante o Jogo.