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