sexta-feira, 11 de abril de 2014

Luzes!!!

Depois de um bom tempo sem postagens, resolvi retomar a nossa série sobre OpenGL no Visual Studio. No último post, nós aplicamos uma textura a um cubo que criamos. Se você observar naquele exemplo, todas as faces apareciam com a mesma coloração. Isto acontece por que não habilitamos ainda o sistema de luzes do OpenGL, e é o que faremos agora.

Mudando a função Load

Os primeiros passos para se habilitar a iluminação serão feitos na função Load de nosso Form. Vamos expandir nossa função para que o resultado fique como está apresentado abaixo:

float light_ambient[4] = { 0.5f, 0.5f, 0.5f, 1.0f };

     GL::Enable(EnableCap::Texture2D);
     GL::ShadeModel(ShadingModel::Smooth);
     GL::ClearColor(0.0f, 0.0f, 0.0f, 0.5f);
     GL::ClearDepth(1.0f);
     GL::Enable(EnableCap::DepthTest);
     GL::DepthFunc(DepthFunction::Lequal);
     GL::Light(LightName::Light0, LightParameter::Ambient, light_ambient);
     GL::Enable(EnableCap::Lighting);
     GL::Enable(EnableCap::Light0);
     textureID = loadTexture("Crate.bmp");
     SetupViewport();
     angle = 0.0f;
     tmrAnimate->Enabled = true;
Como pode-se ver, adicionamos algumas funções novas aqui. Em primeiro lugar, definimos um vetor de 4 posições, que vão indicar as cores de nossa luz ambiente.
Depois de habilitar as texturas, adicionamos a função ShadeModel, que definirá os modelos de sombra que vamos empregar. Adicionamos ainda depois da função ClearColor a função ClearDepth, que define o Buffer de profundidade. Sendo tudo isto feito, habilitamos o teste de profundidade e definimos a função para o teste de profundidade como sendo DepthFunction::Lequal.
É neste momento que iniciamos a parte de iluminação. A função GL::Light cria para nós um tipo de luz. O primeiro parâmetro é o nome da luz criada, e é através deste nome que poderemos depois alterá-la. O segundo parâmetro é o tipo de luz que estamos criando, e por isto aqui definimos uma luz ambiente. O terceiro parâmetro é a cor da luz, que definimos com o vetor light_ambient.
Criada nossa luz, vamos então habilitar a iluminação, depois a nossa luz.

Criando nosso desenho

Algumas mudanças também são necessárias na criação de nosso desenho. Agora que temos iluminação, devemos definir a Normal de cada face de nosso cubo. É baseando-se nesta face que a iluminação de cada face será calculada. Adicionando-se portanto a Normal de cada uma, o código para o desenho ficará:
      // Face frontal
      GL::Normal3(0.0f, 0.0f, -1.0f);
      GL::TexCoord2(1.0f, 1.0f);
      GL::Vertex3(0.5f, 0.5f, -0.5f);
      GL::TexCoord2(0.0f, 1.0f);
      GL::Vertex3(-0.5f, 0.5f, -0.5f);
      GL::TexCoord2(0.0f, 0.0f);
      GL::Vertex3(-0.5f, -0.5f, -0.5f);
      GL::TexCoord2(1.0f, 0.0f);
      GL::Vertex3(0.5f, -0.5f, -0.5f);
      // Face traseira
      GL::Normal3(0.0f, 0.0f, 1.0f);
      GL::TexCoord2(1.0f, 1.0f);
      GL::Vertex3(0.5f, -0.5f, 0.5f);
      GL::TexCoord2(0.0f, 1.0f);
      GL::Vertex3(-0.5f, -0.5f, 0.5f);
      GL::TexCoord2(0.0f, 0.0f);
      GL::Vertex3(-0.5f, 0.5f, 0.5f);
      GL::TexCoord2(1.0f, 0.0f);
      GL::Vertex3(0.5f, 0.5f, 0.5f);
      // Face Direita
      GL::Normal3(1.0f, 0.0f, 0.0f);
      GL::TexCoord2(1.0f, 1.0f);
      GL::Vertex3(0.5f, 0.5f, 0.5f);
      GL::TexCoord2(0.0f, 1.0f);
      GL::Vertex3(0.5f, -0.5f, 0.5f);
      GL::TexCoord2(0.0f, 0.0f);
      GL::Vertex3(0.5f, -0.5f, -0.5f);
      GL::TexCoord2(1.0f, 0.0f);
      GL::Vertex3(0.5f, 0.5f, -0.5f);
      // Face esquerda
      GL::Normal3(-1.0f, 0.0f, 0.0f);
      GL::TexCoord2(1.0f, 1.0f);
      GL::Vertex3(-0.5f, 0.5f, 0.5f);
      GL::TexCoord2(0.0f, 1.0f);
      GL::Vertex3(-0.5f, -0.5f, 0.5f);
      GL::TexCoord2(0.0f, 0.0f);
      GL::Vertex3(-0.5f, -0.5f, -0.5f);
      GL::TexCoord2(1.0f, 0.0f);
      GL::Vertex3(-0.5f, 0.5f, -0.5f);
      // Face superior
      GL::Normal3(0.0f, 1.0f, 0.0f);
      GL::TexCoord2(1.0f, 1.0f);
      GL::Vertex3(0.5f, 0.5f, 0.5f);
      GL::TexCoord2(0.0f, 1.0f);
      GL::Vertex3(-0.5f, 0.5f, 0.5f);
      GL::TexCoord2(0.0f, 0.0f);
      GL::Vertex3(-0.5f, 0.5f, -0.5f);
      GL::TexCoord2(1.0f, 0.0f);
      GL::Vertex3(0.5f, 0.5f, -0.5f);
      // Face inferior
      GL::Normal3(0.0f, -1.0f, 0.0f);
      GL::TexCoord2(1.0f, 1.0f);
      GL::Vertex3(0.5f, -0.5f, 0.5f);
      GL::TexCoord2(0.0f, 1.0f);
      GL::Vertex3(-0.5f, -0.5f, 0.5f);
      GL::TexCoord2(0.0f, 0.0f);
      GL::Vertex3(-0.5f, -0.5f, -0.5f);
      GL::TexCoord2(1.0f, 0.0f);
      GL::Vertex3(0.5f, -0.5f, -0.5f);
Depois de aplicar estas alterações, nosso cubo ficará assim:


As faces já não possuem o mesmo nível de iluminação, como na imagem anterior:


Nenhum comentário:

Postar um comentário

Você também poderá gostar de