Texturas são imagens especiais que são
desenhadas em cima de polígonos para dar-lhes maior detalhe.
Texturas podem ser criadas em tempo real ou carregadas de um arquivo de imagem.
Como imagens de Blitz2D, texturas são compostas de pixels. Estes pixels
podem ser acessados pelas coordenadas x,y como em imagens - só que de
um modo ligeiramente diferente.
Em vez de valores de x,y que variam de 0 até o tamanho da textura, valores
x,y para texturas variam de 0 a 1. Isto significa o pixel de textura no ponto
.5, .5 sempre está no centro da textura. Isto é possivelmente
um pouco confuso no princípio, mas na verdade se mostra muito conveniente
por você não ter que se preocupar com as dimensões das suas
texturas!
Quando uma textura é criada, valores
chamados 'flags' são fornecidos para indicar que tipo de textura será
usado.
Estes são os valores válidos:
1: | A textura tem informação de cor. |
2: | A textura tem informação de transparência (alfa). |
4: | A textura é uma textura vazada (mask). |
8: | A textura tem efeito 'mipmapping'. |
16: | A textura é horizontalmente fixa. |
32: | A textura é verticalmente fixa. |
64: | Textura com efeito 'spherical environment map'. |
Estes valores podem ser somados para combinar
o efeito de diferentes flags. Por exemplo, uma textura com valor 3 indica você
quer uma textura com unformação de cor e informação
de alfa.
Se nem a cor, alfa ou textura vazada forem usadas, então a textura é
criada em um formato especial que lhe permite desenhar nela usando comandos
de Blitz2D ou mesmo Blitz3D! Uma textura criada deste modo terá informação
de cor, mas pode ou não ter informação de alfa (isto depende
de que placa de vídeo você está usando!), assim é
realmente mais seguro assumir que ela não tem nenhuma informação
de alfa.
Se a textura vazada for usada, são ignoradas as informações
de cor e alfa.
Nas texturas vazadas, os pixels da cor preta ficam transparentes.
Com efeito 'mipmapping' as texturas ficam mais
'embaçadas' quando estão muito distantes.
As texturas fixas lhe permitem controlar se a textura 'envolve' o objeto ou
não. Por padrão, texturas irão 'envolver' ou 'repetir'
em áreas grandes. Porém, você pode prevenir isto usando
as texturas fixas.
Finalmente, o 'spherical environment map' provê um modo fácil para
termos uma aparência 'espelhada' no objeto. Experimente!
Você pode criar uma textura e desenhar
sobre ela em tempo real, ou carregar uma textura de um arquivo de imagem.
Carregando uma textura de um arquivo é fácil:
texture=LoadTexture( "mytexture.jpg",3 ) |
Note o flag de valor 3. Isto indica que nós
queremos que a textura contenha informação de cor e alfa.
Porém, o formato JPG não suporta informação de alfa!
Neste caso, o Blitz3D criará seus próprios valores alfa baseado
nas cores da textura.
Já, os formatos PNG e TGA suportam informação de alfa,
e Blitz3D usará esta informação se estiver presente.
Para criar uma textura 'na mão', use o comando de CreateTexture.
;cria uma textura 256x256 texture=CreateTexture( 256,256,0 ) ;lê
sua largura... ;...e altura |
Por que nós estamos recobrando o tamanho
de textura quando nós já informamos para o Blitz3D o tamanho dela?
Bem, isto é porque todos as placas de vídeo 3D têm limites
quanto ao tamanho de textura que eles podem controlar. Tipicamente, largura
e altura deveriam ser múltiplos de 2 (ex: 1,2,4,8,16,32,64,128,256,512,1024...)
e em alguns casos - placas 3DFX sendo as maiores culpadas aqui - não
podem ser maiores que 256 x 256.
Também há rumores que algumas placas podem controlar só
texturas quadradas - embora aqui na Blitz Research nós ainda não
encontramos uma dessas!
Um textura onde largura e altura são ambas múltiplos de 2 e <=
256 é quase garantido ser suportada por sua placa - mas nunca faz mal
conferir!
No momento que você especifica um tamanho de textura não suportado
pela placa de vídeo, o Blitz3D escolherá o tamanho mais próximo
que seja suportado.
Note também que estamos usando flags valor 0. Isto é porque, provavelmente,
queremos desenhar algo à textura, e para poder usar comandos de gráficos
em uma textura você não deve especificar a cor, alfa ou 'mask'
da textura.
OK, agora que criamos nossa textura nós deveríamos desenhar algo
nela:
;define o fluxo de desenho como sendo a textura SetBuffer TextureBuffer( texture ) ;torna vermelha a cor
de fundo ;aplica a cor de fundo ;muda a cor de desenho
para azul ;desenha um oval azul ;de volta ao 'backbuffer' |
Finalmente, uma vez que você terminou com uma textura,
use FreeTexture para liberá-la.
ScaleTexture, RotateTexture e PositionTexture podem ser usados para animar texturas. Por exemplo, para fazer uma textura 'deslizar' , você poderia usar algo como:
;posiciona a textura. |
...no seu loop principal. Você pode escalar e girar texturas dinamicamente de um modo semelhante.
O Blitz3D lhe permite aplicar até 8 texturas
a um único triângulo, uma técnica conhecida como 'multitexturas'.
Um uso comum para multitexturas é 'mapeamento de luz' (light mapping),
uma técnica onde uma textura que contém informação
de iluminação é combinada com uma textura que contém
informação de cor para prover efeitos de iluminação.
Quando você usa os comandos EntityTexture ou BrushTexture, um parêmetro
opcional 'índice' lhe permite controlar qual das 8 texturas você
está definindo.
Por padrão, são combinadas texturas múltiplas usando multiplicação
o que gera um efeito tipo iluminação. Porém, o comando
TextureBlend lhe permite executar outras operações como alfa-blend
e adicionar texturas múltiplas.