A renderização de objetos texturizados, penúltima etapa do meu TCC, é muito simples de ser executada no Managed Direct3D Mobile.
Basicamente o desenvolvedor deve se preocupar com o seguinte:
- Carregar todas as texturas necessárias dentro de uma lista ou array de objetos Texture;
- Definir a luz ambiente do Device;
- Definir a luz ambiente do objeto utilizando um material;
- Para cada objeto, definir a textura que o Device utilizará para desenhá-lo.
Com essa receita de bolo as coisas ficam mais fáceis. Quem dera eu tê-la a 8 horas atrás (é, feriado só existe pros amigos :().
Na prática, isso fica da seguinte maneira:
- Carregar as texturas
A partir de um array de nomes de arquivos (normalmente) basta utilizar o método FromFile da classe TextureLoader para carregar todas as texturas em um array ou lista de objetos Texture. Exemplo:
string file = @"Program Files...cube_text.jpg";
texture = TextureLoader.FromFile(device, file);
No exemplo acima só tenho um objeto e uma textura, por isso utilizei uma única variável.
- Definir a luz do ambiente e do objeto
Eu simplesmente esqueci disso por 8 horas. Passei todo este tempo removendo e adicionando código tentando fazer com que as texturas aparecessem. Nada!
Porém, vale a pena salientar um detalhe: as texturas eram renderizadas, só não estavam iluminadas. Logo, o que acontece se você entra com um papel preto numa sala escura? Não vê ele. O mesmo acontecia com as minhas texturas.
Para definir a luz ambiente do Device, faça o seguinte:
device.RenderState.Ambient = Color.White;
E a luz ambiente do objeto:
material = new Material();
material.Ambient = Color.White;
device.Material = material;
- Definir a textura do objeto a ser desenhado
Esta é a parte mais fácil e óbvia. Sempre que o Device for desenhar os objetos, utilize o seguinte comando:
device.SetTexture(0, texture);
- Exemplo
Um trecho de código demonstrando todos os itens acima é apresentado abaixo:
private void Render()
{
device.Clear(ClearFlags.Target,
Color.White,
1.0f,
0);
device.BeginScene();
if (texture != null)
texture.Dispose();
string file = @"...cube_text.jpg";
texture = TextureLoader.FromFile(device, file);
material = new Material();
material.Ambient = Color.White;
device.Material = material;
device.SetTexture(0, texture);
device.RenderState.Ambient = Color.White;
device.SetStreamSource(0, vertexBuffer, 0);
device.DrawPrimitives(PrimitiveType.TriangleList,
0,
2);
device.EndScene();
device.Present();
}
É claro que o seu VertexBuffer deve possuir, além dos vértices e/ou normais, as coordenadas de textura (U e V).
É isso ae. Até +.