Escolar Documentos
Profissional Documentos
Cultura Documentos
Parte I: Geometria
Waldemar Celes
Departamento de Informática
Tecgraf/PUC-Rio
OpenGL: o que é?
API
Interface para programador de aplicação
Aplicação
API abstrata
API
Dispositivo Dispositivo
de saída de entrada
Por que OpenGL?
rápido
relativamente simples
arquitetura bem definida
bem documentado
independente de sistemas de janelas
primitivas geométricas e imagens
padrão
disponível em diversas plataformas
Pipeline de renderização
Operações Operações
Vértices Rasterização
geométricas sobre
fragmentos
Operações Textura
Imagens
sobre imagens
Frame
Buffer
Primitivas geométricas básicas
Quadrado Polígono
Objetos 3D
Aplicação
GLU
Sistema de
Interface (GLUT) OpenGL
Hardware
Programa simples (usando GLUT)
/* create window */
glutCreateWindow ("simple");
glutReshapeFunc(reshape);
glutDisplayFunc(display);
/* interact … */
glutMainLoop();
return 0;
}
Programa simples (usando GLUT)
/* update screen */
glFlush();
}
Programa simples (usando IUP)
Criação em C
cv = IupGLCanvas( "redraw" ); Atributos
BUFFER = SINGLE ou DOUBLE
COLOR = RGBA ou INDEX
Criação em LED ...
cv = GLCanvas(redraw)
Pipeline de renderização
Operações Operações
Vértices Rasterização
geométricas sobre
fragmentos
Operações Textura
Imagens
sobre imagens
Frame
Buffer
Operações sobre vértices
Transferência de dados
Atrib globais
Material
Fontes de luz
Matrizes
...
Vértices Pipeline
Transformação – Iluminação – Projeção – Clip - Mapeamento
Posição
Normal
Cor Primária
Cor Secundária
Coord. Texs...
Máquina de estado
Ativação de recursos
glEnable/glDisable
Especificação de primitivas
GKS
Antigo padrão gráfico 2D
typedef struct {
float x, y;
} Gwpoint;
Desvantagem
Impunha uma estruturação particular
Se ED: conversão
float x[ ]
float y[ ] Gwpoint p[ ]
Especificação de primitivas
OpenGL 1.0
glBegin(tipo_de_prim);
…define attributo de vértice
…define vértice
glEnd( );
Tipos de primitivas
1 3 4 3 2
1 1 3 5
0 2 0 4 0 1
2 2 0
GL_POINTS
GL_LINES GL_LINE_STRIP GL_LINE_LOOP
2 3
1 3 1 3 5 1
4
0 4
2 5 0 4 0
2
1 5 2
1 5 6 3
2 1 3
0
0 4 7 2 4 0
3 4
GL_QUAD_STRIP GL_POLYGON
GL_QUADS
(convexo)
Especificação de vértice
Especificação da posição
glVertex{tam}{tipo}{vetor} (…);
Exemplo:
GLfloat pos[ ] = {0.4F,9.0F,2.0F};
glVertex3fv(pos);
ou
glVertex3f(0.4F,9.0F,2.0F);
Considerações
Coordenadas homogêneas
Tipo: double x float
Especificação de atributos
Especificação de normal
glNormal* (…);
glEnable/Disable (GL_NORMALIZE);
glEnable/Disable (GL_RESCALE_NORMAL); (OpenGL1.2)
Especificação de atributos
Especificação de cor
Modelo RGB
glColor*(...);
Tipo char: 0 a 255
Tipo short: 0 a 65535
Tipos float e double: 0.0 a 1.0
Modelo de índice
Palheta previamente definida
glutSetColor ( index, red, green, blue );
ou
IupGLPalette ( handle, index, red, green, blue );
Especificação do índice corrente
glIndexi(index);
Especificação de primitivas
OpenGL 1.0
glBegin(tipo_de_prim);
…define attributo de vértice
…define vértice
glEnd( );
Considerações
Não impõe estruturação dos dados
Ineficiente para primitivas complexas
Muitas chamadas de funções
Não permite compartilhamento de vértices
Especificação de primitivas
OpenGL 1.1
Propriedades de vértices em arrays do cliente
Array de vértice (especificação da posição)
size: 2, 3 ou 4 coordenadas
type: GL_SHORT, GL_INT, GL_FLOAT, GL_DOUBLE
stride: offset, em bytes, entre vértices consecutivos
valor zero indica posições consecutivas
pointer: ponteiro para o array
memória sob responsabilidade do cliente
Uso de arrays
Flexibilidades para estruturação de dados
struct {
float x, y, z;
float r, g, b;
} MyVertex;
...
MyVertex p[N];
...
glVertexPointer ( 3, GL_FLOAT, sizeof(MyVertex), p );
Exige ativação
glEnable/Disable (GL_VERTEX_ARRAY);
Suave (Gouraud)
glShadeModel(GL_SMOOTH); // default
glBegin(GL_TRIANGLES);
glColor3f(1.0,0.0,0.0); // red
glVertex2f(-1.0,-1.0);
glColor3f(0.0,1.0,0.0); // green
glVertex2f(1.0,-1.0);
glColor3f(0.0,0.0,1.0); // blue
glVertex2f(0.0,1.0);
glEnd( );
Modelo de shading
Constante
glShadeModel(GL_FLAT);
glColor3f(0.0,0.0,1.0); // blue
glBegin(GL_TRIANGLES);
glVertex2f(-1.0,-1.0);
glVertex2f(1.0,-1.0);
glVertex2f(0.0,1.0);
glEnd( );
Shading constante
0 4
2 5 0 4 0
2
GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN
1 5 2
1 5 6 3
2 1 3
0
0 4 7 2 4 0
3 4
GL_QUAD_STRIP GL_POLYGON
GL_QUADS
Shading constante
glShadeModel(GL_FLAT);
glBegin(GL_TRIANGLES);
glColor3f(1.0,0.0,0.0); // red
glVertex2f(-1.0,-1.0);
glColor3f(0.0,1.0,0.0); // green
glVertex2f(1.0,-1.0);
glColor3f(0.0,0.0,1.0); // blue
glVertex2f(0.0,1.0);
glEnd( );
Renderização de cubos
Teste comparativo
Gforce 2
1600 cubos em movimento, com iluminação
Cubos estáticos
Sugestões?
Renderização de cubos
Cubos estáticos
4a opção: seqüência de QUADS
void drawCube( GLfloat color[], GLfloat* vertex[] )
{
static int idx[6][4] = {{ ... },...};
glColor3fv( color );
for ( int i = 0; i < 6; ++i )
for ( int j = 0; j < 4; ++j )
glVertex3fv( verts[idx[i][j]] );
}
Resultados normalizados
SIGGRAPH 2002, Course # 37, Performance OpenGL: Platform Independent Techniques
Visualizador de reservatórios
Reservatório composto por células
QUAD_STRIP: 1.49
TRIANGLE_STRIP: 1.32
QUAD sem B/E: 1.00
Transformações
X X X
...
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(30,0,0,1);
glTranslatef(10,0,0);
...
Transformações
X X X
…
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(30,0,0,1);
glTranslatef(10,0,0);
...
Pilha de matrizes
…
glMatrixMode(GL_MODELVIEW);
glLoadIdentity( );
glPushMatrix( ); // duplica topo
glRotate(30,0,0,1);
glTranslate(10,0,0);
draw_object_1( );
glPopMatrix( ); // restaura estado
...
Perspectiva
teta w
h
near
far
…
aspect = w / h
glMatrixMode(GL_PROJECTION);
glLoadIdentity( );
gluPerspective (teta_y,aspect,znear,zfar);
...
Ou:
glFrustum (xmineye, xmaxeye, ymineye, ymaxeye, znear, zfar);
Projeção ortográfica
• Ortográfica
near
far
…
glMatrixMode(GL_PROJECTION);
glLoadIdentity( );
glOrtho (xleft,xright,ybottom,ytop,znear,zfar);
...
2D:
gluOrtho2D (xleft,xright,ybottom,ytop); Tutor Projection
Mapeamento
Viewport
glViewport (x, y, width, height);
GLUT & IUP:
• A função default de “resize” define a viewport
como sendo a área total do canvas.
Z-buffer
glDepthRange(znear, zfar); // default: 0, 1
Tratamento de visibilidade
Z-BUFFER
Requisita buffer (GLUT ou IUP)
Habilita teste em Z
glEnable (GL_DEPTH_TEST);
Define teste
glDepthFunc (GL_LESS); // default
Limpa buffer
glClear (GL_DEPTH_BUFFER_BIT);
Animação
Cor e intensidade
ambiente, difusa, especular
Glfloat dif[ ] = {red,green,blue,alpha};
glLightf (GL_LIGHT0, GL_DIFFUSE, dif);
Ativação
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
Variação do desempenho
com o número de fontes de luz
Cor (reflexividade)
Ambiente
Difusa
Especular
Brilho (shininess)
Emissão
Tutor material
Cor como material
glColorMaterial (GL_BACK_AND_FRONT,
GL_AMBIENT_AND_DIFFUSE);
glEnable (GL_COLOR_MATERIAL);
…
glColor3f (red, green, blue);
...
Pilha de grupos de atributos
Rotação
anual
Sol: desenhado na origem
Planeta: pensando em sistema local
• Rotação anual
• Translação em x
• Rotação diária