Compartilhar via


Gráficos 2D para jogos DirectX

Discutimos o uso de gráficos e efeitos de bitmap 2D e como usá-los em seu jogo.

Os gráficos 2D são um subconjunto de gráficos 3D que lidam com primitivos ou bitmaps 2D. De forma mais geral, eles não usam uma coordenada z da mesma forma que um jogo 3D, já que o jogo geralmente está confinado ao plano x-y. Às vezes, eles usam técnicas de gráficos 3D para criar seus componentes visuais e geralmente são mais simples de desenvolver. Se você é novo em jogos, um jogo 2D é um ótimo lugar para começar, e o desenvolvimento de gráficos 2D pode ser um bom lugar para você entender o DirectX.

Você pode desenvolver gráficos de jogos 2D em DirectX usando Direct2D ou Direct3D, ou alguma combinação. Muitas das classes mais úteis para o desenvolvimento de jogos 2D estão no Direct3D, como a classe Sprite . Direct2D é um conjunto de APIs que se destinam principalmente a interfaces do usuário e aplicativos que exigem suporte para desenhar primitivos (como círculos, linhas e formas de polígono plano). Com isso em mente, ele ainda fornece um conjunto poderoso e eficiente de classes e métodos para criar gráficos de jogos, especialmente ao criar sobreposições de jogos, interfaces e heads-up displays (HUDs) - ou para criar uma variedade de jogos 2D, de simples a razoavelmente detalhados. A abordagem mais eficaz ao criar jogos 2D, no entanto, é usar elementos de ambas as bibliotecas, e é assim que abordaremos o desenvolvimento de gráficos 2D neste tópico.

Visão rápida de conceitos

Antes do advento dos gráficos 3D modernos e do hardware que os suporta, os jogos eram principalmente 2D, e muitas de suas técnicas gráficas envolviam mover blocos de memória - geralmente matrizes de dados de cores que seriam traduzidos ou transformados em pixels na tela de forma 1:1.

No DirectX, os elementos gráficos 2D fazem parte do pipeline 3D. Há uma variedade muito maior de resoluções de tela e hardware gráfico disponíveis, e seu mecanismo gráfico 2D deve ser capaz de suportá-los sem uma alteração significativa na fidelidade.

Aqui estão alguns dos conceitos básicos com os quais você deve estar familiarizado ao iniciar o desenvolvimento de gráficos 2D.

  • Pixels e coordenadas raster. Um pixel é um único ponto em uma exibição raster e tem seu próprio par de coordenadas (x, y) indicando sua localização na exibição. (O termo "pixel" é frequentemente usado de forma intercambiável entre os pixels físicos que compõem a tela e os elementos de memória endereçáveis usados para manter os valores de cor e alfa dos pixels antes de serem enviados para a tela.) O raster é tratado pelas APIs como uma grade retangular de elementos de pixel, que geralmente tem uma correspondência 1:1 com a grade de pixels físicos de uma exibição. Os sistemas de coordenadas raster começam no canto superior esquerdo, com o pixel em (0, 0) no canto superior esquerdo da grade.
  • Gráficos de bitmap (às vezes chamados de gráficos rasterizados) são elementos gráficos representados como uma grade retangular de valores de pixel. Sprites - matrizes de pixels computadas gerenciadas independentemente do raster - são um tipo de gráfico de bitmap, comumente usado para os personagens ativos ou objetos animados independentes de fundo em um jogo. Os vários quadros de animação de um sprite são representados como coleções de bitmaps chamados "folhas" ou "lotes". Os planos de fundo são objetos bitmap maiores com a mesma resolução ou maior que a do raster da tela e geralmente servem como pano de fundo para o campo de jogo de um jogo.
  • Gráficos vetoriais são gráficos que usam primitivos geométricos, como pontos, linhas, círculos e polígonos para definir objetos 2D. Eles são representados não como matrizes de pixels, mas como as equações matemáticas que os definem em um espaço 2D. Eles não têm necessariamente uma correspondência 1:1 com a grade de pixels da exibição e devem ser transformados do sistema de coordenadas em que você os renderizou no sistema de coordenadas raster da exibição.
  • Translação é quando você pega um ponto ou vértice e calcula sua nova localização no mesmo sistema de coordenadas.
  • O dimensionamento é quando você amplia ou reduz um objeto por um fator de escala especificado. Com uma imagem vetorial, você reduz e amplia seus vértices componentes; Com um bitmap, você amplia ou diminui os elementos de pixel. Com imagens de bitmap, você perde dados de pixel quando a imagem é reduzida e amplia os pixels individuais quando a imagem é dimensionada para mais perto. Para o último, você pode usar operações de interpolação de cores de pixels, como filtragem bilinear, para suavizar os limites de cores ásperas entre os pixels ampliados.
  • Rotação é quando você gira um objeto em torno de um eixo ou eixos especificados. Com uma imagem vetorial, os vértices da geometria são multiplicados contra uma matriz de rotação para obter o vértice rotacionado; Com uma imagem bitmap, diferentes algoritmos podem ser empregados, cada um com menor ou maior grau de fidelidade nos resultados. Assim como acontece com o dimensionamento e a tradução, existem APIs especificamente para operações de rotação.
  • Transformação é quando você pega um ponto ou vértice em um sistema de coordenadas e calcula seu ponto ou vértice correspondente em outro sistema de coordenadas. Isso inclui translação, dimensionamento e rotação, bem como outras operações de cálculo de coordenadas.
  • Recorte é quando você remove partes de bitmaps ou geometria que não estão dentro da área visível da exibição ou estão ocultas por objetos com maior prioridade de exibição.
  • O buffer de quadros é uma área na memória - geralmente na memória do próprio hardware gráfico - que contém o mapa raster final que você desenhará na tela. A cadeia de troca é uma coleção de buffers, onde você desenha um buffer traseiro e, quando a imagem está pronta, você a "troca" para a frente e a exibe.

Considerações sobre o design

O desenvolvimento de gráficos 2D é uma ótima maneira de se acostumar a desenvolver com o Direct3D e permitirá que você gaste mais tempo em outros aspectos críticos do desenvolvimento de jogos: áudio, controles e mecânica do jogo.

Sempre desenhe para um buffer traseiro. Desenhar diretamente no buffer de quadros significa que sua imagem será exibida quando o sinal de exibição for recebido (geralmente a cada 1/60 de segundo), mesmo que sua operação de desenho não tenha sido concluída!

Projete seu mecanismo gráfico para suportar uma boa seleção de resoluções, de 1024x600 a 1920x1080 (ou superior). Seu público agradecerá se você oferecer suporte à resolução nativa do monitor LCD, especialmente com gráficos 2D.

Uma ótima arte será seu maior trunfo, quando se trata de recursos visuais. Embora seus gráficos de bitmap possam não ter o impacto dos visuais fotorrealistas 3D usando os recursos mais recentes do modelo de sombreamento, uma ótima arte de alta resolução geralmente pode transmitir tanto ou mais estilo e personalidade - e com muito menos penalidade de desempenho.

Referência