May 01 2007

MD3DM: Renderizando objetos texturizados

Autor: Marcos Dell Antonio - Categorias: .NET, Direct3D, Mobilidade

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é +.

Adicione ao del.icio.us del.icio.us | Adicione ao Rec6 Rec6

Faça um comentário