Renderização de objetos com Unreal Engine
1. Lista de Frames e Threads
Para exemplificar o processo de renderização vamos apresentar os seguintes passos conforme as thread são executas:
Threads | ||||
---|---|---|---|---|
CPU | Frame A | Frame B | Frame C | Frame D |
DRAW CPU | Frame A | Frame B | Frame C | |
GPU | Frame A | Frame B | ||
Time in milliseconds | 0 | 33 | 66 |
Acompanhe a ordem de execução de cada Frame.
- O Frame A é instanciado na CPU;
- Logo em seguida o Frame A é passado para um momento onde a CPU e a GPU compartilham alguns elementos de construção. Enquanto isso ocorre a CPU carrega o Frame B;
- Após passar pelo passo de compartilhamento o Frame A é colocado inteiramente na GPU;
- A operação se repete para todos os Frames;
- Perceba que a cada passo que se completa são liberados recursos de CPU e GPU para serem usados com outros frames.
Informação: A seguir vamos abordar cada passo.
2. Processamento do Frame 0 - Time 0 - CPU
Nota: Qualquer coisa relativa a mudança e posição dos objetos é realizado neste passo.
Neste passo o calculo da lógica e as transformações é realizado na CPU, como por exemplo:
Animações - Calcula quando as Animações iniciam e terminam;
Posição de modelos e objetos - Necessário para calcular a posição e sua influência;
Física - Calculo para determinar onde os objetos vão;
Inteligência Artificial - Por exemplo, em um veículo controlado por IA é necessário determinar, como ele se movimenta, como o estado e onde o carro estará realmente;
Cria e destrói, esconde e apresenta - Necessário para determinar onde os objetos aparecem no mundo.
Nota: O Unreal Engine conhece todas as transformações e todos os objetos.
3. Processamento do Frame 1 - Time 33ms - Preparar a Thread
Antes de podermos usar as transformações para renderizar a imagem, precisamos saber o que incluir na renderização, isso é executado principalmente na CPU, mas algumas partes são manipuladas pela GPU, para tal finalidade é realizada a tarefa de :
Processo de oclusão - Construção da lista de todos os objetos e modelos visíveis, sendo que o processamento é realizado por objeto e não por polígono;
Preparação da Thread - Uma Thread da GPU é alocada.
A seguir as 4 Etapas em ordem de execução desse processo.
Distance Culling
- Remove quaisquer objetos além de X da câmera;
Frustim Culling
- Verifica o que está na frente da câmera;
Precomputed Visibility
- (Visibilidade pré-computada) Divide a cena em uma grade, cada célula da grade lembra o que está visível naquele local;
Occlusion Culling
- Verifica com precisão o estado de visibilidade em cada modelo.
4. Processamento do Frame 2 - Time 66ms - GPU
A GPU agora tem uma lista de modelos e transformações, mas se apenas renderizássemos esta informação iria causar uma grande quantidade de renderização de pixels redundantes, portanto, precisamos descobrir quais modelos serão exibidos com antecedência.
Considerando a renderização de cada pixel na cena na imagem acima não poderia renderizar os pixels que estão detrás dos cilindros e os que estão ocultos por outros objetos.