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