Cursos / Jogos Digitais / Introdução a Jogos Digitais / Aula

arrow_back Aula 10 - Motores de Jogos II

2 - Principais Componentes de um Motor de Jogos

2.1 - Gráficos

A parte do motor gráfico é responsável por renderizar, ou seja, desenhar na tela os objetos do jogo. Você sabe como esse processo ocorre? Tentarei apresentar uma versão simplificada, mas certamente seria um assunto que daria várias aulas! Nas disciplinas sobre Motores de Jogos e Modelagem, vocês terão a oportunidade de entender um pouco mais sobre as questões gráficas no desenvolvimento de jogos.

Para desenhar a imagem do jogo no nosso monitor, é necessária uma sequência de passos, que levam desde os arquivos binários que representam os objetos 3D até o conjunto de pontos coloridos que formam as imagens no nosso monitor. Cada pontinho desses é chamado de pixel e representa a menor parte que conseguimos manipular no nosso monitor. Sabe quando falamos de resolução de tela? 1.920 por 1.080? Estamos dizendo que o nosso monitor mostrará a imagem com 1.920 pixels na horizontal e 1.080 na vertical (essa é a resolução full HD, por sinal). Nossa imagem é formada quando juntamos esses vários pontinhos.

As imagens exibidas no nosso monitor são formadas por vários pixels, cada um com sua cor.

Ok, professor, mas por que você está falando disso? É porque nos ajudará a entender vários passos desse processo de renderizar as imagens na tela, normalmente chamado de pipeline gráfico. De uma forma geral, os passos são:

  • Ler os dados representados em um arquivo;
  • Gerar os modelos 3D;
  • Posicionar a câmera do jogo;
  • Fazer uma projeção do mundo 3D para a tela 2D;
  • Realizar algumas (muitas) otimizações;
  • Rasterizar a imagem para a tela do monitor, entre outros ajustes.

Então, continuando... O quê? Vocês querem saber mais sobre cada passo? Está bem, veremos um pouquinho mais a respeito deles. Você já parou para pensar como uma imagem é representada no computador?

Uma imagem 2D do encanador mais querido do mundo dos games!

Se você der um zoom, conseguirá ver os pixels da imagem. No seu computador, provavelmente a imagem estará salva em um arquivo (JPG, GIF, PNG) no qual há um conjunto de informações dizendo quantos pontinhos iremos pintar e as suas respectivas cores. Suponha que o arquivo representante da imagem é composto por vários números da seguinte forma:

100 200 125 250 255 120 78 88 157…

Os sistemas de cores que temos no computador normalmente utilizam uma combinação de três valores para determinar uma cor. Um exemplo disso é o RGB, um sistema famoso que utiliza as cores vermelha (Red), verde (Green) e azul (Blue) de forma misturada para compor um esquema complexo de cores (sacaram o porquê do nome RGB?). Dessa forma, cada número do arquivo representa uma cor que deve ser desenhada na tela: 100 200 125 representa as informações do primeiro ponto colorido e assim por diante. Mas apenas ter esse arquivo não é o suficiente! O computador precisa saber ler essas informações e transformar isso em uma imagem. Sabe quando você pega uma imagem, tenta abrir em um programa e ele diz que o formato é desconhecido, ou dá um erro e não consegue abrir? O que falta para o programa são as instruções de como ler os dados daquela imagem, pois ele precisa saber que a cada três números deve desenhar um pixel de acordo com os valores especificados.

Da mesma forma que uma imagem é definida por um arquivo de dados, os modelos 3D usados na criação de jogos também são! E com mais informações: cada ponto do modelo 3D tem valores de posição especificados nos três eixos de coordenada, e esse conjunto de pontos (chamados de malha) define a forma que o modelo terá.

Um exemplo de modelo 3D. Eita que bicho feio!

Existem diferentes formas de construir esse modelo através do conjunto de pontos: algumas são mais complexas e utilizam equações matemáticas que delineiam com precisão a forma do objeto. Outras são mais eficientes, quebrando o objeto em formas menores, porém mais simples de se desenhar, como triângulos e quadrados. Em jogos, a segunda opção é mais comum, já que os gráficos são gerados em tempo real e precisam de alto desempenho. A primeira forma é mais comum na produção de animações, em que cada cena leva dias para ser renderizada em computadores potentes, processando com exatidão cada parte dos objetos que ganharão vida no filme.

Em animações de alta qualidade, é comum utilizar várias máquinas potentes que passam horas para renderizar um quadro do filme!

Bom, gerado o modelo 3D dos objetos, acabaram os problemas? Não, ainda tem muito chão pela frente. Para continuar o processo de renderização, o próximo passo é definir qual ponto de vista será mostrado desse mundo, isto é, a janela de visualização, sendo esta o local onde estará a câmera do jogo. Essa câmera pode ser colocada para nos passar a visão do personagem, como nos jogos FPS, ou ser mais aberta e nos dar uma visão mais ampla do mundo do jogo, como nos jogos de estratégia ou de aventura. Duas coisas são importantes na definição da posição da câmera: saber quais objetos aparecerão naquele ângulo de visão e a que distância eles estão.

Definida a câmera, vamos para um passo matemático importantíssimo: transformar a nossa visão do mundo 3D em uma projeção 2D. Afinal, nosso monitor é 2D (ainda). Para isso, aplicamos várias contas que determinam como os elementos serão exibidos de acordo com a posição da câmera, inclusive os efeitos de como a iluminação do jogo afeta a visualização de cada objeto na cena. As distâncias e os tamanhos de cada objeto, além das possíveis distorções que ocorreriam na conversão de uma visão 2D de um mundo 3D, são ajustados nesse momento, para que não se perca a relação espacial entre os vários objetos no mundo do jogo.

Feito isso, o próximo passo é a realização de diversas operações de otimização. Essas otimizações vão desde eliminar objetos que não estão dentro da área visível da câmera, até mesmo remover partes de objetos que estão “escondidas” por outros objetos, entre outras ações as quais reduzem a quantidade de elementos que deverão ser tratados na geração da imagem final. Tudo pelo desempenho!

Um dos passos finais é a rasterização: o que não foi cortado na otimização agora é convertido em uma imagem que será exibida para o jogador na tela de sua plataforma. Essa conversão é bem complexa, mas basicamente o que ocorre é uma sequência de operações que determinam as propriedades de cada pixel que irá compor essa imagem final.

Agora pressuponha que você precisasse fazer isso manualmente todas as vezes que quisesse criar um jogo! Ainda bem que existem os motores e componentes gráficos, não é mesmo? Outro detalhe: os jogos 2D, apesar de serem mais simples e não possuírem o mesmo nível de complexidade em todas as etapas, ainda passam por vários passos desse pipeline até a renderização das informações na tela.

Versão 5.3 - Todos os Direitos reservados