Você está na página 1de 37

Esta pgina faz parte do curso de programao de jogos com C++ e DirectX na UniDev

(www.unidev.com.br).
Pgina 1 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Captulo 6
Introduo terica a computao
grfica
Este captulo traz diversos elementos chave da computao grfica em tempo real, com
textos e exemplos tericos poderemos entender aqui, como funcionam os grficos e uma
viso geral de o que se passa no pipeline, como culling, iluminao e os mais diversos
efeitos.
Por Andr Santee
Conceitos bsicos de espao 2D
Conceitos bsicos de espao 3D
Mo-esquerda e Mo-direita
Cmera
Polgonos
Vetores
Normalizando vetores
Vetores cruzados
Produto escalar
Rotao, translao e escala
Translao
Rotao
Escala
Matrizes
Matriz identidade
Transformando matrizes
Escalando matrizes
Transladando matrizes
Rotacionando matrizes
Multiplicando matrizes entre matrizes
Espao de modelo para espao de mundo
Direct3D? OpenGL? API?
Termos que voc precisa saber
Renderizao
Rasterizao
Clipping
Depth-Buffer
Pipeline
Alpha ou alpha blending
Neblina
Vertex Shaders
Pixel Shaders
Modos de classificao de vrtices e tringulos
Triangle Strips
Triangle Fans
Triangle list
Tcnicas de culling
Front e backface culling
Pgina 2 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Clockwise culling
Counter-clockwise culling
Modos de renderizao
Flat shaded
Gouraud shading
Wireframe
Normais
Luzes
Luz ambiente
Luz posicionada
Luz direcional
Holofote
Material
Difuso
Ambiente
Especular
Potncia
Texturas
O que uma textura
Texels
Multitextura
Filtros de textura
Minification
Magnification
Mip-mapping
Front buffer e back buffer
Quadros por segundo (FPS)
Motor?
Padres da programao em C++
Notao hngara
Escrevendo em ingls
Organizao do cdigo

Conceitos bsicos de espao 2D
Antes de entendermos como organizado o espao 3D, vamos ver como o espao 2D
utilizando o padro de tela dos computadores. A expresso 2D dada pois so duas as
dimenses onde os pixels podem ser posicionados, ou seja, X e Y. Sendo X a posio de
um ponto (chamado tambm de "vrtice) da esquerda para direita, seguindo a direo
na horizontal, e Y a posio de um ponto de cima para baixo seguindo a direo na
vertical, como mostra a figura 6.1.

Figura 6.1 - Projeo 2D padro da tela de computador.
Pgina 3 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Vamos supor que a tela para desenho est na resoluo de 800x600s (800 pixels de
largura e 600 de altura) e queremos desenhar uma imagem nas posies (200,100), ou
seja, 200 pixels da esquerda para direita e 100 pixels. Ponto indicado na figura 6.2.

Figura 6.2 - Pixel no ponto (200,100).
Basicamente, este o sistema de coordenadas 2D padro do monitor e utilizado nos jogos
2D.
Conceitos bsicos de espao 3D
Assim como o espao 2D, o espao 3D possui as coordenadas X e Y, mas com algumas
diferenas. No sistema de coordenadas 3D, os eixos X e Y possuem o centro da tela como
origem (ao invs de partir do canto superior esquerdo), e o eixo Y aponta para cima, ao
invs de apontar para baixo.

Figura 6.3 - Representao dos eixos X e Y da projeo 3D.
O ponto negro indicado por Origem [0,0,0] representa o centro da tela e do espao de
mundo, que origina os eixos que apontam cada um para sua respectiva direo.
Temos tambm o ltimo eixo, o Z. Se voc no completamente novo na programao
3D, vai saber que estas so apenas duas dimenses. A que caracteriza os grficos 3D o
eixo Z. Assim como X e Y, se origina no ponto [0,0,0] e aponta para dentro do monitor.
Qualquer ponto que for declarado com a posio Z maior do que 0 est potencialmente
visvel, pois estaria na frente da cmera, que normalmente est posicionada no ponto
[0,0,0] e aponta para frente, ou seja, a cmera, em sua posio padro, aponta para o
eixo Z partindo de sua origem, que [0,0,0]. Como mostra a ilustrao 6.4.
Pgina 4 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.4 - Representao dos trs eixos do espao 3-D.
Um ponto na tela costuma ser representado da seguinte forma: [X,Y,Z]. Onde X, Y e Z
so substitudos pelos valores que representam suas posies nos eixos X, Y e Z de nosso
ponto ou vrtice.
A grande sacada dos grficos 3D a possibilidade de mostrar em um plano 2D uma cena
que possui propriedades tridimensionais. Para isso, o eixo Z deve interferir diretamente
nos eixos X e Y de um vrtice.
Na tela do computador, assim como no mundo real, quanto mais afastado o ponto estiver,
em outras palavras, quanto maior for seu valor no eixo Z, mais prximo do centro da
projeo 2D este estar.
Na computao grfica o efeito de profundidade alcanado dividindo-se os valores X e Y
de um vrtice tridimensional por sua posio no eixo Z. Considere P como sendo um
vrtice qualquer de determinado objeto 3D. Para transformar esta coordenada em 2D
precisamos chegar ao valor de P, que segue a equao 6.1.

Equao 6.1 - Converso de projeo 3-D para 2-D.
Sendo P um vetor bidimensional
J obtemos o efeito de profundidade no ponto. Porm no podemos nos esquecer que a
tela do computador possui sua origem em seu canto superior esquerdo, e para uma
projeo 3D precisamos que a origem esteja localizada exatamente no centro da tela.
Para isso vamos utilizar o vetor bidimensional S que representa a largura (X) e altura (Y)
e pixels da tela. Com a informao contida em S, podemos obter a posio exata de seu
centro, que S/2. Com este valor somado a P temos um ponto 3D com origem no centro
da projeo, que chamaremos de Ps. A equao 6.2 mostra como simples a converso
de projees 2D para o sistema cartesiano ortogonal.
Note que antes da aplicao desta equao necessrio inverter o valor Y da posio em
3D, pois o sistema de coordenadas da tela de computador possui o eixo Y apontado para
baixo.

Equao 6.2 - Centralizando o ponto.
Mas existem tambm outros padres de alinhamento nos eixos, eles so Left-handed
(mo esquerda) e Right-Handed (mo direita).
Pgina 5 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Mo-esquerda e Mo-direita
O sistema de coordenadas representado anteriormente apenas um dos padres. Mais
precisamente, este sistema o mais comum, ele o Mo-esquerda (left-handed). Vire a
palma de sua mo esquerda para cima apontando o seu polegar para frente. Seu dedo
indicador estar apontando para o eixo Y, seu punho para o eixo X e seu polegar para o
eixo Z. Este o padro mo-esquerda. O sistema Mo-Direita (right-handed) o contrrio
disso, voc deve utilizar sua mo direita, com isso, seu polegar aponta para trs, ou seja,
o eixo Z aponta para trs.
A diferena entre ambos os sistema basicamente esta. No modo left-handed o eixo Z
apontar para o interior da tela e no right-handed apontar para fora da tela. Como
mostra a figura 6.5.

Figura 6.5 - Representao dos dois modos de projeo cartesiana.
Esta ilustrao foi retirada da Microsoft Developer Network Library
(http://msdn.microsoft.com/library/)
Cmera
Em mundos 3D, importante tambm, e de grande ajuda, poder manipular a direo e a
posio de nossa cmera. A cmera tambm pode ser representada como o local de onde
quem est vendo a cena est posicionado, mais precisamente, a posio e ngulo dos
olhos do observador. Imagine um cubo composto por linhas, posicionado em [0,0,10] no
modo Mo-esquerda, e nosso observador visualiza o cubo do ponto [0,0,0] e apontando
para o ponto [0,0,1], ou seja, a cmera est apontando para frente. O visualizador estaria
vendo algo semelhante ao que mostrado na figura 6.6.

Figura 6.6 - Cubo sendo visto de frente.
Agora vamos reposicionar a cmera em [-3,2,7], ou seja, iremos, partir de agora,
observar o cubo pelo seu lado esquerdo (-3), um pouco mais para o alto (2) e mais
prximo no eixo Z (7), lembrando que ele estava disto em 10 unidades da cmera. E
vamos tambm apontar a cmera para o ponto [0,0,10], ou seja, o observador estaria no
posio [-3,2,7] com os olhos apontados para o ponto [0,0,10]. O cubo passaria a ser
Pgina 6 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
visto do ngulo mostrado na figura 6.7.

Figura 6.7 - Cubo sendo visto de uma perspectiva diagonal.
Polgonos
Tambm chamados de faces, so os polgonos que formam tudo que desenhado em
uma cena 3D. Teoricamente, um polgono uma face com 3 ou mais lados e vrtices.
Uma maneira simples de pensar em um vrtice de um polgono, imaginar que vrtice
o ponto onde acaba uma aresta de comea a outra. Em quase todos os padres de
grficos 3D, os polgonos usados so triangulares, ou seja, contm trs lados e trs
vrtices.
Os polgonos so usados para formar tudo, desde uma face de quatro lados (formado
simplesmente por 2 tringulos, um ao lado do outro) a um complexo personagem
formado por milhares de tringulos. Um tringulo composto por 3 vrtices. Um vrtice
possui uma estrutura bsica:
struct Vertice
{
float x,y,z;
};
Voc tambm poderia inserir variveis para armazenar a cor do vrtice, coordenadas de
textura, etc. mas por ser apenas uma demonstrao faremos apenas um vrtice que
armazena suas posies X, Y e Z.
E a estrutura bsica de um polgono a seguinte:
struct Triangulo
{
Vertice v0,v1,v2;
};
As estruturas do tipo Vertice correspondem s posies de cada vrtice do tringulo.
Qualquer corpo que formado por um conjunto de vrtices, como uma bola, um corpo
humano ou um cubo conhecido como mesh, ou em portugus tambm chamado de
objeto ou modelo 3D. Em jogos profissionais, geralmente os meshes so carregados de
arquivos, que so modelados em sofwares como o 3D Studio Max, Maya, LightWave,
entre outros. No cabe a este livro dizer-lhe como criar seus prprios personagens em
jogos. Mais adiante, vamos falar sobre como carregar modelos 3D em arquivos, que
podem ser usados para personagens, armas e elementos de cenrio. Um mesh
basicamente formado por uma array de tringulos ou vrtices indexados.
No momento em que este texto est sendo escrito, uma das placas de vdeo mais
Pgina 7 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
poderosas a RADEON X800, da ATI, e sua capacidade de processamento contada em
700 milhes de vrtices por segundo, ou 233 milhes de tringulos no indexados.
Vetores
Vetores, assim como vrtices, so entidades constitudas por 3 componentes reais. Esta
entidade utilizada para determinar direo, assim como a direo de um tringulo ou
plano, de uma luz ou cmera.
Normalizando vetores
O uso mais comum dos vetores em sua forma normalizada, ou seja, que possuindo
comprimento de 1.0, da origem sua posio. Para normalizar um vetor utiliza-se a
seguinte frmula:

Equao 6.3 - Para a obteno de um vetor normalizado o dividimos por seu prprio
mdulo.
Vetores cruzados
Outra operao com vetores muito comum e til freqentemente utilizada na
programao de jogos o clculo do vetor cruzado. Esta tcnica consiste na obteno de
um vetor perpendicular entre dois outros vetores. Isto feito como mostra a equao 6.4.

Equao 6.4 - Sendo C um vetor perpendicular de A e B.
Como voc pode ver, matematicamente, utilizamos o operador X para representar este
tipo de operao entre vetores.
Produto escalar
Ao contrrio da operao de vetor cruzado, o produto escalar de um ou dois vetores um
nmero real apenas. Resultado da soma dos produtos dos trs componentes, X, Y e Z de
um mesmo ou apenas dois vetores. Esta operao, representada entre dois vetores pelo
smbolo `. (ponto final), retorna um valor menor do que zero caso os vetores estejam
apontando para direes opostas e maior se ambos apontarem para a mesma direo. Por
isso muito utilizado para clculos de iluminao, sendo utilizado para comparar a direo
dos polgonos ou pixels com a direo da luz.
Rotao, translao e escala
Todo tipo de animao num mundo 3D feita partir de combinaes de translao
(movendo o ponto de origem), rotao (girando uma vrtice em torno de sua origem) e
escala (aumentando ou diminuindo a distncia de um vrtice em relao ao centro
multiplicando-o por determinado valor).
Translao
Para definir a posio de um vrtice, precisamos pensar como se este estivesse partindo
Pgina 8 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
do ponto de origem [0,0,0] para a posio que o programador definir. A tcnica da
translao utilizada para, basicamente, alterar a posio do ponto de origem. Um
exemplo simples: possumos um modelo 3D centralizado no ponto [0,0,0]. Se este objeto
for transladado para [10,20,30] ele imediatamente passar a estar centralizado no ponto
[10,20,30] do espao de mundo.
Rotao
Assim como as coordenadas possuem 3 eixos, X, Y e Z, a rotao tambm possui 3 eixos,
estes so rotacionado no sentido indicado pela figura 6.8.
- Rotao em torno do eixo : rotaciona os vrtices verticalmente, de modo que a
posio horizontal dos vrtices mantenha-se esttica.
- Rotao em torno do eixo : rotaciona horizontalmente a geometria de modo que
aos vrtices possuam seu valor Y inalterado.
- Rotao em torno do eixo : os vrtices so rotacionados como o ponteiro de um
relgio visto de frente. Neste, o eixo Z permanece esttico durante a operao.

Figura 6.8 - Os trs eixos de rotao.
Para entender melhor como funciona a rotao imagine o Sistema Solar. Pense no Sol
como o ponto de origem ou o ponto no qual a cena est transladada, agora apenas
imagine os planetas e corpos girando em torno do Sol como se fossem os vrtices dos
tringulos do objeto 3D. assim que a rotao age sob os modelos e a cena.
Escala
Trata-se de aumentar a proporo da cena. Para isto basicamente multiplica-se os valores
da cada vrtice a ser desenhado pelo valor da escala. Escalar uma cena por 1 seria
mant-la em tamanho orginal, multiplicar por 0.5 seria diminuir pela metade todos os
meshes que sero desenhados e multiplicar por 2 seria duplicar seu tamanho.
Normalmente possvel escalar como o programador desejar, os valores X, Y e Z dos
vrtices de cada modelo, ou seja, podemos apenas esticar nosso objeto no eixo Y,
tornando-o comprido ou engord-lo escalando apenas os valores X e Z, alm de vrias
outras combinaes.
Matrizes
Matrizes matemticas so o que fazem a translao, rotao e escala das cenas. Tratam-
se de matrizes 4x4 (16 variveis do tipo float). Aqueles que prestaram ateno nas aulas
de lgebra vo se lembrar delas, que quando transformadas podem rotacionar, escalar e
transladar uma cena ao multiplicar a matriz final pelos vrtices dos meshes no espao de
mundo. Matrizes podem ser representadas de 2 maneiras:
struct Matriz
{
float _11, _12, _13, _14;
float _21, _22, _23, _24;
Pgina 9 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
float _31, _32, _33, _34;
float _41, _42, _43, _44;
};
Ou simplesmente:
float matriz[4][4];
Se voc ainda no tem nenhum contato com computao grfica, com certeza est se
perguntando: "Para que servem esse monte de nmeros?. muito simples.
Determinados valores em determinadas posies dentro da matriz podem carregar valores
de escala, translao e rotao. Aps rotacionada, escalada e transladada voc pode
definir a matriz como a matriz de mundo (afetar todas os vrtices que forem desenhadas
em seguida) ou definir a matriz como posio da cmera (valores de escala so
ignorados). O caminho para conseguir uma matriz final, toda transformada, ou seja,
rotacionada, escalada e transladada da maneira que o programador definir dividido em
11 passos:
1. Crie as matrizes T (para ser transladada), Rx, Ry e Rz (para serem rotacionadas em
torno de seus respectivos eixos) e S (para ser escalada);
2. Crie a matriz R para receber o valor multiplicado de cada matriz;
3. Translade a matriz T;
4. Rotacione Rx em torno do eixo X, Ry em torno do eixo Y e Rz em torno do eixo Z;
5. Escale a matriz S;
6. Torne R uma matriz identidade;
7. Multiplique R por S e ponha o resultado em R;
8. Multiplique R por Rx e ponha o resultado em R;
9. Multiplique R por Ry e ponha o resultado em R;
10. Multiplique R por Rz e ponha o resultado em R;
11. Multiplique R por T e ponha o resultado em R;
Completados estes 11 passos a matriz R estar pronta. Mais adiante voc ver na prtica
como utilizar esta matriz para que faa seu efeito sob uma cena 3D. As bibliotecas atuais
no exigem que o programador tenha um conhecimento neste assunto voltado a matrizes.
Porm sempre importante ver estes tpicos para que no mnimo possa ter uma noo
do assunto. Com a biblioteca de suporte da Direct3D voc encontrar funes que
multiplicam e transformam as estruturas de matrizes para voc.
Matriz identidade
Uma matriz identidade possui a configurao equivalente ao nmero 1, sendo que pode-
se multiplicar qualquer valor por 1 e este sempre se manter esttico. O mesmo acontece
com a matriz identidade. Qualquer outra matriz multiplicada pela identidade resulta no
valor dela mesma. Veja a configurao de uma matriz identidade:
1, 0, 0, 0
0, 1, 0, 0
0, 0, 1, 0
0, 0, 0, 1
Transformando matrizes
Pgina 10 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Para transformar uma matriz podemos utilizar diversos mtodos, porm, para aplic-la a
transformaes do espao de mundo ou o espao de viso (cmera) temos apenas quatro
transformaes bsicas, que so: translao, rotao e escala (no usada nas
transformaes de cmera).
As transformaes se resumem em definir valores em determinadas posies da matriz.
Escalando matrizes
Os elementos de uma matriz que tratam da escala so: a11, a22 e a33, que escalam o
objetos nos eixos X, Y e Z respectivamente. A matriz de escala representada na figura
6.9.

Figura 6.9 - Matriz de escala.
Transladando matrizes
Para transladar uma matriz, manipulamos os elementos a41, a42 e a43 para os eixos X, Y
e Z respectivamente. A matriz de translao representada pela figura 6.10.

Figura 6.10 - Matriz de translao.
Rotacionando matrizes
Ao contrrio da translao e escala, a rotao tratada com uma matriz para cada eixo,
portanto, teremos 3 matrizes de rotao. As matrizes de rotao em torno dos eixos X, Y,
e Z so mostradas nas figura 6.11, 6.12 e 6.13 respectivamente.

Figura 6.11 - Rotao em torno do eixo X.

Figura 6.12 - Rotao em torno do eixo Y.
Pgina 11 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.13 - Rotao em torno do eixo Z.
Multiplicando matrizes entre matrizes
Como mostrado anteriormente, para obter uma matriz que realize escala, rotao e
translao na cena ou objeto, necessrio multiplic-las, para multiplicar duas matrizes,
utilizamos a seguinte operao:
Considere as matrizes:
A B C D A B c D
E F G H E F G H
A = I J K L A= I J K L
M N O P M N O P
A matriz resultante da multiplicao deve seguir as seguintes operaes:
AA+BE+CI+DM AB+BF+CJ+DN AC+BG+CK+DO
AD+BH+CL+DP
EA+FE+GI+HM EB+FF+GJ+HN EC+FG+GK+HO
ED+FH+GL+HP
A X A = R = IA+JE+KI+LM IB+JF+KJ+LN IC+JG+KK+LO
ID+JH+KL+LP
MA+NE+OI+PM MB+NF+OJ+PN MC+NG+OK+PO
MD+NH+OL+PP
Com isso teremos a matriz resultante R. Por mais que esta operao parea assustadora,
ao pass-la para o cdigo as coisas ficam mais simples, como mostra o pseudocdigo de
multiplicao entre duas matrizes:
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
R[i][j] = 0;
for (k=0; k<4; k++)
{
R[i][j] += mat1[i][k] * mat2[k][j];
}
}
}
Sendo R a matriz final e A e A as matrizes a serem multiplicadas. Caso voc no tenha
entendido esta parte, ou no saiba qual ser a utilidade de cada um dos aspectos aqui
levantados, no se preocupe. Entenderemos melhor mais adiante.
Note que este o sistema de matrizes padro do Direct3D, se transformadas nos modos
listados anteriormente, funcionaro perfeitamente no Direct3D, porm, no so
necessariamente o padro utilizando em outras APIs grficas. O mesmo vale para a matriz
de projeo.
Pgina 12 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Espao de modelo para espao de mundo
Para que um vrtice, de determinado modelo seja transformado, precisamos realizar uma
operao entre este vetor representado pela posio deste vrtice e a matriz que
obtemos. No pipeline padro do Direct3D, esta operao consiste em atribur a nova
posio atravs do produto de 4 elementos da matriz transposta entre a posio do
vrtice em espao de modelo..
Considere o vrtice:
float vert[4];
Sendo os trs primeiros elementos desta array as posies X, Y e Z do vrtice, e o ltimo
(chamado de W) um componente extra utilizado pelo Direct3D para diversas operaes,
principalmente voltadas a profundidade do pixel, das quais no vm ao caso discutirmos
agora.
Agora vamos considerar a seguinte matriz 4x4 j transformada:
float mat[4][4];
Agora que temos o ponto vert e a matriz mat, podemos realizar a operao de
transformao do vrtice, de espao de modelo para o espao de mundo:
vert[0] = vert[0]*mat[0][0] + vert[1]*mat[1][0] + vert[2]*mat[2][0] + mat[3][0];
vert[1] = vert[0]*mat[0][1] + vert[1]*mat[1][1] + vert[2]*mat[2][1] + mat[3][1];
vert[2] = vert[0]*mat[0][2] + vert[1]*mat[1][2] + vert[2]*mat[2][2] + mat[3][2];
vert[3] = vert[0]*mat[0][3] + vert[1]*mat[1][3] + vert[2]*mat[2][3] + mat[3][3];
Mais sobre transformaes de matrizes ser visto na prtica, no captulo seguinte.
Direct3D? OpenGL? API?
At agora aprendemos a utilizar arquivos de cabealho como iostream.h, ostream.h,
string.h, math.h entre outros. Estes arquivos contm funes que facilitam a vida do
programador, como escrever textos na tela, manipular strings e receber valores do
teclado. Na programao 3D isto muito semelhante. O programador ir utilizar arquivos
de cabealho que contm definies de funes que desenham polgonos, tratam de
vrios efeitos como transparncia, neblina, textura, e que fazem todo o trabalho pesado
da renderizao e rasterizao.
Assim funcionam as APIs, que possuem as instrues dentro de uma DLL, um arquivo LIB
far o link entre o header correspondente e a DLL, que ser inclusa ao nosso programa,
permitido-nos a utilizar funes da API.
As APIs grficas mais famosas e consideradas fundamentais atualmente na programao
grfica so Direct3D (da Microsoft) e OpenGL (da SGI). Direct3D faz parte do pacote
chamado DirectX, da Microsoft, onde encontramos o DirectSound, DirectMusic, DirectPlay,
DirectDraw, entre outros. Todas estas so APIs que acessam diretamente o hardware,
facilitando infinitamente o trabalho do programador.
OpenGL e Direct3D so APIs que funcionam perfeitamente na plataforma Windows, e so
usadas para acessar o hardware grfico em aplicativos 3D, seja em jogos, ferramentas ou
sistemas de realidade virtual. A vantagem em utilizar uma destas duas APIs deve-se ao
fato de que a maior parte das placas de vdeo atuais so especializadas em realizar os
clculos necessrios para chegarmos aos grficos 3D. Ou seja, uma acelerao e um
ganho de performance incomparvel ao uso de um programa que fizesse todo o trabalho
3D via clculos por software, ou seja, sem acelerao por hardware e feitos totalmente
pela CPU. Atualmente todos os jogos comerciais/profissionais utilizam uma ou ambas
estas APIs.
Pgina 13 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Uma API geralmente possui seu cdigo em arquivos de biblioteca dinmicos (DLL). Todas
as funes e instrues que sero chamadas por nosso programa esto nestes arquivos. O
que faz a ligao entre eles e nosso programa um arquivo LIB, que ao ser unir-se ao
compilador, aponta determinada DLL. Mas para que as funes possam ser usadas
necessrio defini-las. Estas definies resumem-se em funes, objetos e demais
processos contidos na DLL, por isso, alm do prprio arquivo .dll e o .lib, precisamos do
arquivo .h ou .hpp (o mesmo que .h).
Por exemplo, para utilizar OpenGL, no pacote disponvel em seu site oficial, voc
encontrar os arquivos:
GL.H
OPENGL32.LIB
OPENGL32.DLL
O nico arquivo que o usurio de seu programa ou jogo ir precisar para rodar seu jogo
a DLL. Os arquivos .lib e .h so de uso exclusivo do programador com o compilador.
esta a razo de encontrarmos em caixas de jogos textos como: " necessrio DirectX 8.1
ou superior. Se voc utiliza Windows, provavelmente j possui alguma verso do DirectX
instalado em sua mquina. neste pacote que se encontram as DLLs para que o usurio
possa rodar tranqilamente um aplicativo feito com ajuda do DirectX.
Para o desenvolvedor, geralmente as LIBs e cabealhos das APIs esto disponveis em
pacotes, conhecidos como SDK (Software Development Kit).
Termos que voc precisa saber
Antes de falar sobre programao 3D em C++, precisamos ver ou rever alguns termos e
conceitos que ajudam a compreender melhor as coisas antes que se possa se embolar
quando for aplicar tudo na prtica.
Renderizao
o nome dado ao processo de calcular posies, cor e diversos elementos dos polgonos,
em relao cmera e as propriedades de projeo e desenh-los na tela. Calculando
informaes de cor para criar os efeitos de luz, neblina, reflexos, e mais. Em seu pipeline
padro, a API faz isto tudo para ns.
Rasterizao
o ato de desenhar linhas de um ponto a outro no espao ou desenhar polgonos partir
de trs ou mais pontos (vrtices). Para ser rasterizado, o ponto j deve estar
transformado para espao de tela 2D. Normalmente voc no precisa entender a prtica
do processo de rasterizao, a API faz isto tudo para voc.
Clipping
o processo de diviso e recorte de tringulos. Quando um tringulo est na cena, mas
est sendo mostrada na tela apenas parte do mesmo (a outra parte est fora dos frustum
planes) o tringulo dividido no pipeline de modo que seja cortada a parte que est para
fora e seja desenhada apenas a parte de dentro. Isto pode poupar tempo no pipeline.
Depth-Buffer
o local na memria onde estar armazenado o valor de profundidade que dado a cada
pixel durante a rasterizao para saber quais pixels, de cada tringulo, esto mais
Pgina 14 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
distantes e quais esto mais prximos cmera. Para que um pixel que, teoricamente
estaria atrs de outro, no seja desenhado em sua frente.
Pipeline
A grosso modo, podemos dizer que onde ocorrem todos os processos de clipping,
renderizao, rasterizao, blending e buffering.
Alpha ou alpha blending
o nome dado tcnica de combinar a cor de um pixel cor do pixel de fundo para
simular o efeito de transparncia, como mostra a figura 6.14, observe que o crculo azul
est transparente, assim voc pode ver com uma pequena perda de qualidade visual,
parte da esfera vermelha que est ao fundo.

Figura 6.14 - Combinao de cores com alpha blending.
A transparncia pode ser calculada com a adio, que se resume basicamente na soma
dos valores do pixel ser desenhado com a cor de fundo. Na equao 6.5, F representa a
cor de fundo, S a cor do pixel que est sendo desenhado e F como sendo a cor final.

Equao 6.5 - Combinao por adio.
Nesta tcnica, quanto mais clara for a cor do pixel, mais forte e opaco o objeto
transparente ser. A combinao aditiva muito usada em geometrias que representam
efeitos como fogo, halos e demais elementos que emitem luz.
A combinao tambm pode ser obtida modulando-se a cor do pixel cor de fundo, como
mostra a equao 6.6.

Equao 6.6 - Combinao por multiplicao.
Com o alpha modulado, ao contrrio da forma aditiva, quanto mais escuro for o pixel mais
opaco este ser. Ideal para o desenho de sombras simples que escurecem determinada
rea e tambm para realizar a atenuao por pixel de luzes.
Porm, o blending mais comum realizado atravs de interpolao. Normalmente a
interpolao linear baseada no fator U sendo 0 >= U <= 1. Como mostra a equao 6.7.
Pgina 15 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Equao 6.7 - interpolao linear.
Esta geralmente a tcnica de blending mais usada por no depender do brilho do pixel
para determinar sua opacidade.
Em todas estas tcnicas de combinao de cores, no necessrio um profundo
conhecimento sobre seu uso na prtica pois como sempre, uma API 3D far todo este
trabalho para ns, nos bastando especificar qual o tipo de clculo que desejamos.
Neblina
Conhecido como fog em ingls, este um efeito que torna os pixels ou vrtices distantes
menos visveis, de acordo com a cor especificada para a neblina. Existem dois tipos
bsicos de neblina:
+ Por pixel - mais realista em mundos 3D com poucos polgonos, com base na
distncia entre o pixel e a cmera (depth), o rasterizador determina a intensidade da
neblina sob aquele pixel.
+ Por vrtice - ao invs de calcular a distncia do pixel, ser calculada a distncia do
vrtice em relao a cmera, e ento determinada a intensidade da neblina
interpolando os valores fog dos vrtices, esteticamente ruim em cenas com polgonos
grandes e em pequena quantidade.
Normalmente pode-se especificar a que distncia da cmera a neblina ter incio e onde
acabar. Um exemplo simples de neblina pode ser visto na figura 6.15.

Figura 6.15 - Efeito de neblina em funcionamento.
Vertex Shaders
Shaders so a ltima palavra em renderizao em tempo real da atualidade. A
importncia em serem comentados neste livro se deve ao fato de que atualmente esta
caracterstica est em todo o lugar, e muitas vezes, quem est comeando no sabe do se
se trata o assunto. Esta linguagem permitem que o programador, atravs de uma sintaxe
semelhante Assembly (instrues de baixo nvel) ou C, controlem as cores, posies e
demais propriedades dos vrtices diretamente pelo pipeline, reprogramando-o quase por
completo, com total acelerao via hardware (caso a placa de vdeo oferea o devido
suporte). A grande vantagem que torna possvel a adio dos mais complexos efeitos
quase sem custo performance.
Pixel Shaders
Assim como os vertex shaders controlam os vrtices, os pixel shaders permitem que o
Pgina 16 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
programador, via linguagem de baixo nvel, possa controlar as cores e coordenadas de
texturas de cada pixel individualmente. Esta novidade permite a criao de efeitos desde
iluminao fotorealstica a superfcies procedurais geradas ou manipuladas em tempo real.
Modos de classificao de vrtices e tringulos
Triangle Strips
um mtodo de organizao de vrtices que evita que o programador escreva dezenas de
vrtices para criar formas simples como cubos e pirmides. Este mtodo funciona
basicamente da seguinte maneira: aps declarados os trs primeiros vrtices, a cada
prxima declarao ser gerado um novo tringulo partir dos dois ltimos vrtices da
lista. A figura 6.16 mostra como a configurao de um strip simples.

Figura 6.16 - Esquema de um triagle strip bsico.
Os nmeros, de 0 a 7 mostram a ordem em que os 8 vrtices so declarados. Este um
exemplo simples de triangle strip.
Triangle Fans
Mais simples e fcil de compreender em relao aos triangle strips, com triangle fans,
aps declarados os 3 primeiros vrtices, a cada vrtice declarado ser desenhado um
novo tringulo partir do primeiro e do ltimo vrtice da lista, como mostra a figura 6.17.

Figura 6.17 - Esquema de um triagle fan.
Com triangle fans podemos criais as mais variadas formas de planos poligonais sem a
necessidade de utilizar muitos vrtices.
Pgina 17 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Triangle list
o nome dado ao mtodo convencional para desenho de tringulos. A cada trs vrtices
declarados desenhado um tringulo.
Tcnicas de culling
A maior parte dos modelos 3D composto por faces em todos os seus lados, ou podemos
tambm dizer que so modelos fechados. Portanto, natural que existam dezenas de
faces que no so vistas de determinado ngulo e mesmo assim passam pelo
rasterizador. Para isto usada esta tcnica de culling, que descarta aquelas faces voltadas
para trs. Observe bem a chaleira ilustrada na figura 6.18 sendo renderizada sem culling.
Est em wireframe para que possamos visualizar as faces de trs. A mesma chaleira foi
mostrada na figura 6.19 utilizando uma tcnica de culling:

Figura 6.18 - As faces viradas para trs podem ser vistas atravs da grade.

Figura 6.19 - Note que as faces no viradas para a cmera no foram renderizadas.
A metade das faces, que estariam invisveis foram cortadas da cena e no passaram pela
fase de rasterizao. O que um grande ganho na performance. Atualmente, os mtodos
de culling mais conhecidos so back e front face culling, conhecidos tambm como
clockwise e counter-clockwise culling.
Front e backface culling
Este mtodo verifica se uma face est voltada para frente (front) ou para trs (back)
orientando-se pela normal da face, gerada no pipeline ou definida pelo programador. Caso
a normal esteja voltada para frente, a face ser eliminada com front face culling, caso
contrrio, o back face culling pode remover as faces voltadas para trs.
Clockwise culling
O mesmo que front face culling.
Pgina 18 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Counter-clockwise culling
O mesmo que back face culling.
Modos de renderizao
Flat shaded
o nome dado a objetos 3D renderizados sem interpolao (suavizao) entre as cores
de um vrtice a outro do mesmo tringulo, trazendo um efeito muito pouco natural aos
modelos e fazendo com que o baixo nmero de polgonos fique mais evidente. Um
exemplo de modelo renderizado em flat-shaded mostrado na figura 6.20.

Figura 6.20 - A renderizao em flat-shaded coloca em evidncia o baixo nmero de
polgonos dos modelos 3-D de jogos eletrnicos.
Gouraud shading
o contrrio do flat shading, mais conhecido entre os modeladores e artistas 3D como
smooth shaded, aqui ocorre a interpolao e a suavizao das cores entre um vrtice a
outro. Observe o mesmo modelo da figura 6.20 renderizado no modo Gouraud Shading na
figura 6.21.
Pgina 19 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.21 - A tcnica Gouraud shading compensa a baixa quantidade de polgonos.
Wireframe
um estado de renderizao onde apenas as linhas das arestas dos tringulos so
desenhadas, como mostra a figura 6.22. utilizada na maioria das vezes para depurar ou
demonstrar a proporo de polgonos em um modelo. No utilizado com freqncia em
jogos ou cenas de realidade virtual.

Figura 6.22 - O modo wireframe um exelente modo para observar a quantidade de
polgonos dos modelos 3-D.
Normais
Uma normal uma espcie de vetor, que est contido na maioria das estruturas de
vrtice, e necessrio para que seja calculada a iluminao do modelo. Ela usada em
cada vrtice, para indicar ao pilelin para que direo o vrtice ou tringulo est apontado.
Assim podemos saber se uma luz est afetando um tringulo ou no. Na figura 6.23 as
Pgina 20 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
normais do modelo esto representadas pelas retas que "saem de cada vrtice:

Figura 6.23 - As normais devem apontar sempre para fora.
Agora vamos incrementar nossa estrutura de vrtices adicionando a direo da normal:
struct Vertice
{
float x,y,z;
float nx, ny, nz;
};
Alguns programadores preferem representar de outra maneira:
struct Vertice
{
Vetor Pos;
Vetor Normal;
};
Os valores nx, ny e nz ou Normal.x, Normal.y e Normal.z correspondem direo da
normal em relao posio do vrtice, e no devem ultrapassar o limite de [-1.0, 1.0]
em cada eixo, levando em considerao que o mesmo dever ser normalizado (possuir
comprimento 1).
Luzes
As luzes so o que do mais de realismo a cenas 3D. Elas podem dar sensao de
profundidade, relevo, dimenso e posio. Na computao grfica, existem 4 tipos de luz,
e podem afetar geometrias por vrtice ou por pixel (na textura). Elas so: ambiente
(ambient), posicionada (point), holofote (spot) e direcional (directional).
Luz ambiente
a cor ambiente que todas as faces iro possuir. A cor ambiente ser misturada a cor
original da face. Caso a cor ambiente esteja em RGB(0,0,0) (preto) todas as faces sero
pretas. Caso o ambiente esteja em RGB(70,70,70) todas as faces ficaro um pouco
escuras, dando impresso de um ambiente noturno.
Apesar de ser esttica e uniforme, a luz ambiente adicionada atenuao e incidncia
Pgina 21 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
das demais luzes dinmicas. Diferentes cores de luz ambiente foram comparadas e
exibidas nas figuras 6.24, 6.25, 6.26 e 6.27.

Figura 6.24 - Cor ambiente RGB(255,255,255)

Figura 6.25 - Cor ambiente RGB(255,0,0)
Pgina 22 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.26 - Cor ambiente RGB(0,255,255)

Figura 6.27 - Cor ambiente RGB(172,172,172)
Luz posicionada
a fonte de luz que, de alguma posio, emite luz para todos os lados, em toda sua volta.
Um esquema simples de luz posicionada pode ser visto na figura 6.28. Um bom exemplo
deste tipo de luz o Sol em relao ao Sistema Solar. Este est posicionado no centro
iluminando todos os planetas em sua volta.
Pgina 23 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.28 - A luz posicionada um ponto que emite luz para todas as direes.
Sendo P a posio da luz no espao 3D, C sua cor, N a normal do vrtice atual e V sua
posio, a incidncia de uma luz posicionada calculada como mostra a equao 6.8.

Equao 6.8 - Multiplica-se o produto escalar entre a normal da superfcie e o vetor que
vai da luz ao vrtice pela cor da luz.
Observaes
- Para um resultado correto recomendvel que o vetor da luz P-V seja normalizado
(possua comprimento 1) antes da obteno do produto escalar entre a normal.
- A equao 6.8 no considera a atenuao da luz, que pode ser calculada multiplicando-
se o valor de incincia da luz C pelo resultado da equao 1-max(D,R)/R sendo D=P-
V.P-V e R=RR com R representando o alcance mximo da luz (range). Note que este
no necessariamente o mtodo utilizado no pipeline padro do Direct3D para a
obteno do fator de atenuao da luz.
Luz direcional
Ela chega de todos os lugares, partir de um ngulo especificado. No existe um exemplo
deste tipo de luz no mundo real, pois todos os raios incidem paralelamente como mostra a
figura 6.29.
Algo semelhante a luz direcional o Sol em relao ao nosso planeta. Se ns colocamos
um objeto em algum local, sob luz do Sol, veremos que sua sombra est com
determinada proporo e em determinada direo. Se colocamos outro objeto a 5
quilmetros de distncia do outro, veremos que a sombra possui praticamente as mesmas
propriedades, ou seja, a luz incide de uma direo constante com raios paralelos e igual
para todos os locais. No mundo real isto impossvel, mas a melhor maneira de simular
fontes de luz como o Sol em relao terra.

Figura 6.29 - A luz direcional possui direo paralela para toda a geometria na cena.
Sendo D a direo da luz direcional e C sua cor, sua incidncia obtida pela equao 6.9.

Equao 6.9 - Multiplica-se o produto escalar entre a normal da superfcie e a direo da
luz pela cor da luz.
Holofote
simples, porm envolve os clculos mais "pesados. por ser pesado e esteticamente
Pgina 24 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
invivel nvel de iluminao por vrtice que deixaremos este tipo de iluminao de lado.
Teoricamente, a luz do tipo holofote como a luz vinda de uma lanterna, ou um holofote
propriamente dito. Atinge os vrtices a sua frente com seu campo em formato de cone,
como mostra a figura 6.30.

Figura 6.30 - A luz direcional incide na cena em forma de cone.
Material
Os materiais so o que determinam a cor, a intensidade da luz e de seu sob uma
superfcie ou vrtice. Existem 4 elementos bsicos em um material: a cor difusa (diffuse),
ambiente (ambient), especular e fora (power). No Direct3D, os materiais tambm
contm valor de cor emissiva, mas geralmente este valor ignorado. No Direct3D, a
estrutura dos materiais a seguinte:
typedef struct _D3DMATERIAL9 {
D3DCOLORVALUE Diffuse;
D3DCOLORVALUE Ambient;
D3DCOLORVALUE Specular;
D3DCOLORVALUE Emissive;
float Power;
} D3DMATERIAL9;
Sendo D3DCOLORVALUE a seguinte estrutura de RGBA:
typedef struct _D3DCOLORVALUE {
float r;
float g;
float b;
float a;
} D3DCOLORVALUE;
Difuso
a cor do vrtice que tomar fora quando alguma luz que no seja a ambiente afetar o
mesmo.
Ambiente
a cor refletida pela face quando no existe nenhuma luz atingindo-a..
Especular
Quando a normal de uma face atinge uma diferena muito baixa em relao a direo de
um luz, ela passa a refletir esta luz, como mostra a figura 6.31. Este um efeito muito
bonito e pode simular superfcies como a de ouro, plstico fosco e liso e muitas outras
combinaes. Os valores R, G e B controlam a cor deste reflexo. Geralmente este valor
Pgina 25 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
tido como RGB(1.0,1.0,1.0), assim refletindo a cor especular original da luz.

Figura 6.31 - A cor especular simula a reflexo da luz por uma superfcie.
Potncia
O membro D3DMATERIAL9::Power controla a intensidade e grau de difuso do reflexo nos
vrtices do modelo. O que acontece no pipeline padro do Direct3D para obter a cor
difusa mostrado na equao 6.10.

Equao 6.10 - O valor da cor de incidncia da luz somado este mesmo valor elevado
potncia n, que eqivale a D3DMATERIAL9::Power, e ento obtm-se a cor final da luz
F.
(Obs.: as equaes de luz devem tambm considerar sua atenuao e cores secundrias
do pixel referentes a textura e cor difusa dos vrtices)
Quanto menor o valor de Power, mais difuso e fraco o reflexo, e quando maior, menos
difuso e mais forte este . Como mostra a figura 6.32.

Figura 6.32 - Diferentes valores para n.
Texturas
Pgina 26 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
O que uma textura
A grosso modo podemos dizer que a tcnica de texturizao resume-se em "pintar, com
um bitmap, os polgonos dos personagens e do cenrio. Normalmente carregado de um
arquivo na memria (.bmp, .jpg, .tga, .png, etc.).
Texels
Esta a parte mais difcil de se compreender na teoria da texturizao: texel a
abreviatura de texture-element, trata-se da coordenada correspondente a cada pixel da
textura. As coordenadas so normalmente organizadas entre dois eixos, conhecidos como
U, para o eixo X da textura na face, e V, para o eixo Y. Cada texel uma coordenada
interpolada de vrtice a outro em cada pixel da face.
A figura 6.33 mostra como o sistema de coordenadas das texturas, que o mesmo
utilizado na projeo 2D padro da tela de computador.

Figura 6.33 - O sistema de coordenadas de textura nas faces o mesmo usado para
projees 2D.
Para entendermos melhor o conceito de coordenadas UV considere o triangle strip de
quatro vrtices mostrado na figura 6.34.

Figura 6.34 - Uma simples estrutura formada por tringulos.
Cada vrtice possui suas coordenadas UV, ento vamos adicionar este valor nossa
estrutura de vrtices:
struct Vertice
{
float x,y,z;
float nx, ny, nz;
float u,v;
};
Pgina 27 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Imagine que o strip mostrado na figura 6.34 possua as coordenadas UV em cada um de
seus vrtices configuradas como mostra a figura 6.35.

Figura 6.35 - Vrtices mapeados utilizando coordenadas de textura.
Quando os valores esto organizados da maneira mostrada na figura 6.35 e variando seus
valores entre 0.0 e 1.0, toda a textura plotada na face. Imagine que temos o arquivo
crate.bmp, e e definimos este bitmap como a textura dos tringulos mostrados na figura
6.34, teremos um strip onde toda a textura ser distribuda entre o quadrado. A figura
6.36 ilustra este resultado.

Figura 6.36 - Note que todo o bitmap foi distribudo entre os texels da superfcie.
Para entender melhor o funcionamento deste sistema de coordenadas de textura devemos
seguir um raciocnio lgico. Quando algum valor est em [0,0], o vrtice ter as posies
0,0 da textura, ou seja, seu canto superior esquerdo nos eixos UV. E quando um vrtice
possui o valor [1.0,1.0] o vrtice possuir o canto inferior direito da textura em seu incio,
seja ela de tamanho 128x128 ou 1024x768, o valor 1.0 sempre representar sua
extremidade.
Vamos voltar a observar nosso strip. O vrtice possui [0,0], o incio nos dois eixos. O
vrtice [1,0] pega o final no eixo U e o incio do eixo V, e assim por diante, at que sejam
arranjados todos os vrtices da textura em cada vrtice da primitiva.
Mas coordenadas de textura no se baseiam em apenas valores de 0 a 1. Quando
realizamos a experincia de quadruplicar os valores U e V das coordenadas dadas na
figura 6.35, teremos o resultado semelhante ao mostrado na figura 6.37.
Pgina 28 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.37 - A textura distribuda pela superfcie 4X4 vezes.
Quando o valor maior que 1 ou menor que 0, o renderizador corre pela textura at
alcanar este valor. Outra experincia interessante, dividir o valor. Se dividissemos os
valores todos por 2, teramos na face apenas da textura. Como mostra a figura 6.38.

Figura 6.38 - Apenas da textura mostrado.
Com esta combinao de Us e Vs, e com a ajuda de softwares que editam e salvam
modelos 3-D em arquivos, podemos obter complexas formaes e posies de vrtice
para interessantes modelos 3D. A textura o elemento que mais d detalhes a modelos
poligonais, como pode ser constatado com a comparao feita na figura 6.39.

Figura 6.39 - Este modelo chama-se Goblin, e foi produzido para o jogo Quake II por
Conrad (con@telia.com) e Rodrigo (rodrigo@sport4u.com).
A imagem usada para exemplificar as texturas neste livro (nome original: crate.bmp) foi
criada para os exemplos de OpenGL do site nehe.gamedev.net.
Pgina 29 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
Multitextura
Um s vrtice pode conter at 8 coordenadas de textura (dependendo do suporte que a
placa de vdeo oferece) para utilizar at 8 texturas. Esta tcnica chamada
multitexturizao, onde o renderizador combina as cores dos pixels das 8 texturas
declaradas para a face. Este efeito muito til para colocar em prtica tcnicas como
iluminao por textura (lightmapping) e adio de mais detalhe textura.
Filtros de textura
Como dito anteriormente, as texturas podem conter os mais variados tamanhos e
propores. Mas muito comum uma textura ser distribuda por inteiro em uma face
muito menor que as dimenses do bitmap. Ou ento uma textura muito pequena estar em
uma face muito grande para seu tamanho. Para isto servem os tipos de filtro na textura.
Vamos falar sobre 3 tipos de filtro: o magnification filter, minification filter e o mip-
mapping.
Minification

Figura 6.40 - Superfcie texturizada sem o filtro Magnification.
Com certeza voc j esteve jogando jogos 3D da velha guarda, como Doom, Hexen e
Heretic, encostou em uma parede ou billboard e viu que os pixels das texturas foram
esticados na face. No h quem no repare nisto. Felizmente a computao grfica
evoluiu, e agora temos como "embaar esta textura esticada, com clculos acelerados
por hardware. Esta tcnica chama-se min filter, e os clculos para realizar esta correo
podem ser bilineares ou anisotrpicos. Mas normalmente utilizamos o clculo bilinear para
realizar a interpolao entre as cores dos pixels. Basta especificar o tipo de filtro para a
API que ela realizar todos os clculos para voc.
A figura 6.40 mostra uma superfcie renderizada sem o uso do min filter, j em 6.41
temos a mesma textura com esta tcnica em uso.
Pgina 30 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.41 - Superfcie texturizada aps a aplicao do filtro Magnification.
Magnification

Figura 6.42 - Superfcie texturizada sem o filtro Minification.
O mag filter o inverso do min filter. Ele trata de situaes em que uma grande textura
ocupa a rea de uma face muito pequena. Este problema mais comum e persistente do
que as situaes que exigem min filter. Observar o cho e paredes que esto a uma longa
distncia em jogos 3D antigos uma boa maneira de notar o magnification.
Observando as figuras 6.42 e 6.43 podemos comparar uma textura renderizada sem mag
filter com outra que por sua vez pe em prtica a tcnica.

Figura 6.43 - Superfcie texturizada aps a aplicao do filtro Minification.
Mip-mapping
Em alguns casos, o mag filter no suficientemente eficiente. No sendo o bastante para
que haja um perfeito encaixe entre a textura e a face. Para isto aplica-se o mip-mapping.
Trata-se da criao de vrias verses de um mesmo bitmap, cada uma menor e mais
embaado que a ltima. Cada uma destas variaes de tamanho da textura so chamadas
de miplevels. No pipeline, feita uma checagem para que se possa constatar se a textura
est muito grande em relao a proporo da face transformada em coordenadas 2D. Se
sim, o Direct3D encontra o miplevel mais adequado para a face. A imagem 6.44 mostra
alguns miplevels criados partir de uma textura de tamanho original.
Pgina 31 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html

Figura 6.44 - Diferentes nveis de mipmaps.
Observe na figura 6.45 como fica a aparncia de cena onde o mip-mapping encontra-se
desligado e compare com a figura 6.46 que possui o mip-mapping ativado.

Figura 6.45 - Muitos pixels que formam o contorno da textura so perdidos.

Figura 6.46 - Com o mip-mapping, os detalhes da superfcie no so perdidos.
Veja que aos poucos o solo torna-se menos serrilhado. Este o papel do mip-mapping.
Direct3D possui funes em sua biblioteca de ajuda que criam os miplevels
automaticamente ao carregar a textura original.
Estas imagens foram retiradas do artigo Mip-Mapping in Direct3D, do site
www.GameDev.net.
Front buffer e back buffer
Esta tcnica utilizada em todos os jogos e aplicativos grficos para PC, seja ele 3D ou
2D. Antes de falar do que se trata vamos definir o termo frame, ou quadro. Um quadro
finalizado quando tudo que est contido em uma cena termina de ser renderizado e ento
jogado na tela. Para desenhar o prximo quadro ns precisamos limpar a tela. Quando
ns limpamos a tela, a API que estamos usando, ou a API do prprio Windows, corre por
todos os pixels da tela que estamos usando e os pinta da cor solicitada. Mas isto demora
um certo tempo para ser feito pelo peograma, e ns podemos ver os pixels sendo limpos
e os prximos sendo desenhados. Isto d um terrvel efeito de "pisca-pisca na tela. A
tcnica chamada double buffer capaz de corrigir isto.
Um buffer um local na memria onde podemos armazenar alguns valores temporrios.
Quando nossa API ou rasterizador qualquer termina de desenhar uma cena, ao invs de
enviar os pixels diretamente tela, manda todos estes pixels para um local temporrio na
Pgina 32 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
memria, um buffer. Este local chamado de back buffer, toda a operao feita l.
Quando este servio concludo, o back buffer passa a ser front buffer e vice-versa. O
front buffer ser sempre o local na memria onde esto os pixels que voc est vendo. Se
ns primeiro limparmos o back buffer, desenharmos, e em seguida apenas permutarmos
os buffers, no teremos mais o problema de pisca na tela.
Quadros por segundo (FPS)
Como ns j definimos anteriormente, um quadro se encerra quando o back buffer
limpo, desenhado e ento permutado com o front buffer. Quanto mais otimizado for seu
cdigo e mais potente seu hardware (principalmente tratando-se de placa de vdeo para
grficos 3D) mais rapidamente um quadro finalizado. O grande desafio dos
programadores profissionais atualmente conseguir uma maior qualidade grfica, com
mais elementos, luzes e detalhes na cena e ainda assim com o menor tempo de trmino
de quadro possvel. Quando o programador atinge este objetivo, os quadros so
finalizados mais rapidamente.
Com o passar do tempo, os programadores sentiram a necessidade de padronizar uma
unidade de medida para comparar velocidades e acompanhar como anda a performance
do programa em diferentes mquinas com diferentes tcnicas de otimizao e
renderizao. Para isto existe o FPS, frames per second ou simplesmente quadros por
segundo. Que mede a quantidade de quadros que esto sendo desenhados a cada
segundo em um programa. Existe uma frmula para calcular a taxa de FPS atual da cena,
porm o algoritmo mais vivel e flexvel atualiza de 1 em 1 segundo a taxa de FPS e pode
ser impresso na tela enquanto sua cena renderizada.
Motor
Com certeza, o termo mais conhecido entre qualquer gamer "engine", conhecido
tambm, em portugus, como motor. Mas o que um Motor? Como, quando e onde so
feitos? Como so usados? O que se esperar de cada um destes? Estas so as questes
que, irnicamente, qualquer gamer imponente, orgulhoso e soberano no saber
responder.
Definir o significado e utilidade de um motor, para quem no est na rea da
programao, no tarefa fcil, como de praxe, eu poderia dizer que o pilar sustentador
de um jogo, so as engrenagens que o jogador no pode ver. Porm esta frase
tericamente explicativa nada define. Ao comear pela excluso do conceito "engines so
programas que fazem os jogos", em parte, a afirmao est correta, mas motores no
so obrigatoriamente programas ou um monte de aplicativos e ferramentas de auxilio
com interface visual e linguagens de scripting com regras e constantes prprias, como 3D
Game Studio e muitos outros vistos aos montes.
A maior parte dos motores so constitudos de cdigos, instrues como "desenhe o
personagem", "se o objeto est em uma superfcie inclinada, deslize em direo
depresso", "ilumine a superfcie se est apontada para a luz", "crie o volume da sombra
e realize sua extruso ", ento, estas instrues so chamadas e executadas pelo jogo.
Motores so desenvolvidos, normalmente, com linguagens de programao de alta
performance, como C++. Os cdigos contendo as instrues e rotinas so compilados em
DLLs ou LIBs, arquivos binrios que armazenam todo o cdigo e utilizados pelo
executvel. Existem tambm os motores do tipo software, ou framework, oferecendo
aplicaes com interface visual ou simples linguagens de programao/scripting para a
criao e edio dos mais variados eventos e efeitos.
Encontramos diversas caractersticas muito peculiares ao analisar os mais diversificados
tipos de motores, a maioria - e usada apenas em projetos que envolvem programao de
baixo nvel, como Half-Life 2 - desenvolvida para executar apenas uma ou poucas
tarefas, processar o controle de fsica e coliso da cena, renderizao, animao facial e
controle de dispositivos de rede so algumas das funcionalidades que possuem os
Pgina 33 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
motores especializados.
Vamos exemplificar o uso de um elemento tcnico de um motor que criaremos mais
adiante que carrega personagens animados do Quake2, os arquivos .md2. Para carregar
apenas 1 modelo e renderizar na tela, precisamos de centenas de linhas de cdigo: para
abrir o arquivo, ler o que est contido nele, converter para o cach do Direct3D, etc..
Ento, para simplificar nossa vida, ns podemos escrever um simples motor para isso,
algo que possa carregar qualquer arquivo MD2 com apenas 2 ou 3 instncias.
Consideramos ento a classe MD2Loader, veja o exemplo de seu uso:
MD2Loader md2file;
md2file.LoadMD2("tris.md2);
md2file.RenderMD2();
Assim, com um comando carregamos o arquivo e com outro o desenhamos. Criar
componentes como este faz com que o resto do desenvolvimento do jogo torne-se mais
simples.
Ns iremos criar alguns simples componentes de motores (tambm conhecidos como
engines) que tratam da animao de personagem, cenas 3D e iluminao.
Padres da programao em C++
Para que exista uma maior organizao no cdigo, eu irei seguir uma srie de padres
partir de agora, para escrever nossos componentes. Especificar e concretizar um padro
de programao antes de comear a desenvolver excelente para que alm de tornar o
cdigo mais elegante e legvel para ns mesmos, torna mais fcil o compartilhamento de
dvidas a respeito de seu cdigo com qualquer programador de qualquer nacionalidade
caso seja necessrio divulgar parte do cdigo.
Notao hngara
A Notao Hngara um padro idealizado por um programador hngaro que comeou a
utilizar determinados prefixos em suas variveis. Um prefixo para cada tipo, para facilitar
a leitura. Atualmente este padro muito utilizado principalmente pela Microsoft em suas
APIs. Os prefixos que adotaremos daqui para frente so:
Seqncia Bool
by BYTE ou UCHAR (char e unsigned char)
c Caractere
dw DWORD (typedef unsigned long)
fn Funo ponteiro
h Controle (como um ponteiro, usado para objetos Windows)

i int ( inteiro )
l LONGO (long int)
lp Ponteiro Longo (32-bit)
n Nmero (curto ou inteiro)
w WORD ou UINT (unsigned int ou unsigned short)
Basicamente, isto aplica-se ao prefixo de qualquer varivel que se encaixe no perfil listado
na tabela anterior. Por exemplo:
bool bVar;
int iNumber;
Pgina 34 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
char cDigit;
unsigned long dwColor;
int *lpHandle;
Escrevendo em ingls
Este assunto pode gerar uma grande guerra entre programadores. Normalmente,
imagina-se que um programador brasileiro v escrever os nomes de suas variveis,
funes e classes em portugus, mas nem todos gostam disso. Existem vrios grandes
motivos para no escrever nomes de identificadores em portugus:
1. A maior parte da documentao que um programador utiliza para se especializar em
determinado assunto est em ingls. Ler documentos em ingls e escrever em
portugus pode gerar confuso.
2. Quase todos os grupos de discusso on-line, onde existem centenas de programadores
experientes e muitos deles profissionais na rea, que podem ajud-lo em seu
problema, tem como idioma principal o ingls, ao colar um trecho de seu cdigo para
pedir determinado tipo de ajuda, as coisas ficam mais fceis quando os nomes esto
em ingls.
3. Quando os nomes esto em ingls, seu motor ou biblioteca pode ser distribuda e
utilizada sem problemas por qualquer programador em qualquer parte do mundo.
4. O idioma oficial da programao o ingls, as palavras chave do C++ so em ingls,
as funes das bibliotecas e APIs que voc ir utilizar esto em ingls, tudo est em
ingls. Esteticamente falando, no bonito misturar idiomas em um cdigo s.
No existe um motivo maior que impea um programador de idioma principal no-ingls a
seguir o costume de "programar em ingls. A escolha particular de cada programador.
Organizao do cdigo
Para que o cdigo seja organizado o suficiente para portar projetos de grande escala,
precisamos comear com o mesmo j organizado, isso bvio. E uma boa maneira de
organizar um cdigo dividi-lo em arquivos. Uma classe que realiza determinada
operao por exemplo, pode ter suas definies em um arquivo .h (cabealho) e seu
corpo em um arquivo .cpp. Ento, caso necessitemos daquela classe, basta utilizar o
#include para ter a classe a nosso dispor no arquivo principal, que contm a funo main.
Para criar um arquivo de cabealho em seu projeto, tenha-o aberto no compilador Visual
C++, clique em File, em seguida escolha a opo New; uma janela ir surgir. Na aba
Files, selecione a opo C/C++ Header File, certifique-se que o campo Add to Project
esteja selecionado, d um nome, algo como cClass ao arquivo de cabealho, na caixa de
texto File name, e ento clique em OK. Agora vamos escrever uma simples classe:
cClass.h:
#ifndef _CCLASS_HEADER_FILE_
#define _CCLASS_HEADER_FILE_

#include <ostream.h>
#include <string.h>

class cClass
{
Pgina 35 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
public:
cClass() { strcpy(szName, "default); }
void SetName(char *var);
void PrintName();
char *GetName();
protected:
char szName[150];
};
#endif
A diretiva de compilao #ifndef, verifica se determinada constante j foi definida com
#define. Se no, ser definido tudo que se segue para o cdigo objeto at que seja
encontrado o #endif. Caso o macro _CCLASS_HEADER_FILE_ no esteja declarado, ser
declarado logo em seguida juntamente com o restante do cdigo, caso contrrio, nada
acontece. Isto evita erros comuns de linkeditao, como por exemplo, a definio de dois
ou mais objetos do mesmo nome no cdigo objeto. Ou seja, no importa em quantos
arquivos .cpp o cClass.h estiver incluso, tudo ser definido apenas uma vez, sem dores de
cabea.
Repita o processo mas desta vez escolha a opo C++ Source File, d a ele novamente o
nome cClass (mas desta vez ser cClass.cpp). E insira o seguinte cdigo ao arquivo:
cClass.cpp:
#include "cclass.h

void cClass::SetName(char *var)


{
strcpy(szName, var);
}

void cClass::PrintName()
{
cout << "\nA string eh: " << szName << "\n;
}

char *cClass::GetName()
{
return szName;
}
Primeiramente ns inclumos o arquivo cClass.h, onde temos as definies da classe.
Como ns j inclumos ostream.h e string.h no arquivo cClass.h, isto no precisa ser
repetido em cClass.cpp. Agora vamos voltar ao arquivo onde se encontra a funo main e
mostrar como se usa tudo isso:
main.cpp:
#include "cclass.h

Pgina 36 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html
int main()
{
cClass cc;
cc.PrintName();
cc.SetName("NOVA STRING);
cc.PrintName();
cout << cc.GetName() << "\n;
return 0;
}
No h mistrio. Agora vamos ver o que aconteceu:
+ Ao criar o cdigo objeto de cClass.cpp, o compilador primeiramente definiu tudo que
estava em cClass.h (com o #include no incio do arquivo) no cdigo objeto
+ Com o #include no arquivo main.cpp, ns definimos que a classe cClass existe, e
ento, na linkeditao feita a ligao entre o objeto de main e o objeto cClass.
Pgina 37 de 37 UniDev :: UDCO :: Guia do Iniciante na programao de jogos com C++ - Aula 6
16/12/2005 file://C:\Arquivos de programas\Unidev\UDCO\Aula 6.Html