Computação Gráfica I

Trabalho Prático

Exercícios



1. Sombreamento/Shading

Parte I

O modelo de iluminação padrão em OpenGL é muito simples. Ele projeta os objetos 3D sobre um plano de visualização sem considerar as conções de iluminação da cena. Como resultado, o objeto como o vemos é apenas um silhueta com a cor do objeto e um contorno que lembra sua forma. É assim que temos visto nossos objetos até agora.

Agora, vamos ver como os algoritmos de sombreamento vistos em aula podem ser usados em OpenGL para melhorar o aspecto visual.

Fig. 1 - Esquerda: o que tínhamos até agora. Direita: o que queremos!

Comecemos por um pouco de padronização. Na verdade, programadores em OpenGL, sempre que poissível, concentram as linhas de código para sombreamento em uma função chamada "setupRC" (setup rendering context), que é chamada uma única vez na inicialização do programa. Aconselho a todos fazerem o mesmo.

void setupRC(){

glDepthFunc(GL_LESS); // O tipo de teste de profundidade a ser feito
glEnable(GL_DEPTH_TEST);// Habilita o teste de profundidade
glFrontFace(GL_CCW); // Seta o sentido anti-horário para composição de triângulos (regra da mão direita)

glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); // Limpa o buffer de cor e profundidade

}

Comecem com as inicializações básicas, e então adicionaremos linhas uma por uma, sempre testando para ver o resultado, mas antes:

Exercício :

1. Apresente o "Boston Teapot" da figura 1 em cor-de-rosa sobre um plano retangular como na imagem. para gerar o teapot e o plano, use o código abaixo na função display:

// Desenha plano

glPushMatrix();
glScalef(100,100,100);
drawPlane();
glPopMatrix();
// Desenha o teapot

glColor3f(1.0,0.5,0.5);
glPushMatrix();
glTranslated( 0, 15, 0 );
glScaled(20,20,20);
glutSolidTeapot(1.0);
glPopMatrix();

Se quiser, pode usar esta função para desenhar o plano:

void drawPlane(){

glTranslatef(-0.5,0,-0.5);
glColor3f(0,0.5,1);
glBegin(GL_POLYGON);
glNormal3f( 0, 1, 0 );
glVertex3f(1,0,1);
glVertex3f(1,0,0);
glVertex3f(0,0,0);
glVertex3f(0,0,1);

glEnd();

}

2. Para iluminar o seu teapot, ative o sombreamento da cena com a chamada abaixo (faça a chamada na setupRC):

glEnable( GL_LIGHTING );

Resultado:

A imagem está completamente escura porque ainda não instalamos uma fonte de luz.

3. Ainda na SetupRC, instalar uma fonte de luz difusa com:

 GLfloat diffuseLight[] = { 0.7, 0.7, 0.7, 1.0 };	/// RGBA, varie os 3 primeiros parametros para mudar a cor e a intensidade da luz.   
glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuseLight ); /// Cria a fonte de luz
glEnable( GL_LIGHT0 ); /// Acende a luz!
 Adicione as seguintes linhas que a cor definida para o objeto surta efeito.
glEnable( GL_COLOR_MATERIAL ); glColorMaterial( GL_FRONT, GL_AMBIENT_AND_DIFFUSE );

4. Adicione uma componente de ambiente à sua fonte de luz para evitar que regiões escuras apareçam completamente pretas e portanto invisíveis sobre um fundo preto.

GLfloat ambientLight[] = { 0.05, 0.05, 0.05, 1.0 };		/// Define cor e intensidade da luz ambiente
glLightfv( GL_LIGHT0, GL_AMBIENT, ambientLight ); /// Adiciona a componente ambiente

5. O teapot não está muito brilhante. Adicione uma componente especular à sua fonte de luz:

GLfloat specularLight[] = { 0.7, 0.7, 0.7, 1.0 };
GLfloat spectre[] = { 1.0, 1.0, 1.0, 1.0 };

glLightfv( GL_LIGHT0, GL_SPECULAR, specularLight );
glMaterialfv( GL_FRONT, GL_SPECULAR, spectre );
glMateriali( GL_FRONT, GL_SHININESS, 128 );

6. Experimente os dois tipos diferentes de sombreamento implementados em OpenGL. Use glShadeModel para mudar o modelo de iluminação.

 	glShadeModel(GL_FLAT);		// Enables Flat Color Shading
//glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading (default)

7. Modifique a posição de sua fonte de luz:

	GLfloat lightPos[] = { 600.0, 10.0, 200.0, 1.0 };
glLightfv( GL_LIGHT0, GL_POSITION, lightPos );


Tutorial

O programa do tutorial sobre material de reflexão de luz (acima) demonstra como as propriedades de luz e material em OpenGL interagem e influenciam entre si. Todas as propriedades de material e luz podem ser alteradas. Um segundo painel de comando permite modificar parametros de uma luz do tipo spot e fatores de atenuação.
(c) Nate Robins (source: http://www.xmission.com/~nate/tutors.html)