António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica...
Transcript of António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica...
![Page 1: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/1.jpg)
António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09
Computação Gráfica
Desempenho
![Page 2: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/2.jpg)
DI-UM Computação Gráfica 08/09 2
Desempenho
• Tópicos:
– Display Lists
– Vertex Buffer Objects
![Page 3: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/3.jpg)
DI-UM Computação Gráfica 08/09 3
Display Lists: Introdução
• As DL são um mecanismo que permite “compilar” no driver sequências de comandos. Por exemplo:
– Transformações geométricas
– Coordenadas de Vértices
– Coordenadas de texturas e normais
– Mudanças de estado, ex: iluminação e cores.
![Page 4: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/4.jpg)
glVertex3f(..)glNormal3f(..)glTexCoord2f(..)
glTranslate(...) glColor3f(...)
DI-UM Computação Gráfica 08/09 4
Display Lists: Introdução
A especificação de geometria, transformações e atributos implica
invocar uma função por entidade e uma comunicação CPU/GPU
por função
Uma Display List permite que a sequência de comandos necessários para modelar um objecto seja especificada apenas uma vez, compilada pelo driver gráfico e armazenada na memória do GPU
Quando se pretender desenhar o objecto invoca-se a Display List
![Page 5: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/5.jpg)
Display Lists: Introdução
• Vantagens:
– As DLs são armazenadas na memória da placa, se possível.
– Uma só invocação por frame versus n para cada um dos comandos armazenados.
DI-UM Computação Gráfica 08/09 5
![Page 6: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/6.jpg)
DI-UM Computação Gráfica 08/09 6
Display Lists: Comandos
• SetupGLuint glGenLists( GLsizei range ); Gera um conjunto de IDs únicos e sequenciais e devolve o primeiro.
• Definiçãovoid glNewList( GLuint ID, GL_COMPILE );
// comandos para a lista void glEndList( void );
• UtilizaçãoglCallList( GLuint ID); realiza o render da display list
![Page 7: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/7.jpg)
DI-UM Computação Gráfica 08/09 7
Display Lists: Comandos
• Libertar recursos
void glDeleteLists(GLuint listID, GLsizei numberOfLists);
Liberta recursos de uma sequência de comprimento numberOfLists, a partir do índice listID.
![Page 8: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/8.jpg)
DI-UM Computação Gráfica 08/09 8
Display Lists: Comandos
Setup e Geração
id = GenLists(1);glNewList(id,GL_COMPILE);
glTranslatef(10.0f,5.0f,3.0f);glBegin(GL_TRIANGLE_STRIP);
glVertex3f(1.0f,1.0f,1.0f);...
glEnd();glEndList();
Utilização
glCallList(id);
![Page 9: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/9.jpg)
DI-UM Computação Gráfica 08/09 9
Display Lists: Exemplo
void drawSnowMan() {glColor3f(1.0f, 1.0f, 1.0f);
// Draw BodyglTranslatef(0.0f ,0.75f, 0.0f); glutSolidSphere(0.75f,20,20);
// Draw HeadglTranslatef(0.0f, 1.0f, 0.0f); glutSolidSphere(0.25f,20,20);
// Draw EyesglPushMatrix();glColor3f(0.0f,0.0f,0.0f);glTranslatef(0.05f, 0.10f, 0.18f); glutSolidSphere(0.05f,10,10);glTranslatef(-0.1f, 0.0f, 0.0f); glutSolidSphere(0.05f,10,10);glPopMatrix();
// Draw NoseglColor3f(1.0f, 0.5f , 0.5f);glRotatef(0.0f,1.0f, 0.0f, 0.0f); glutSolidCone(0.08f,0.5f,10,1);
}
![Page 10: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/10.jpg)
DI-UM Computação Gráfica 08/09 10
Display Lists: Exemplo
• Sem Display Lists
for(i = -3; i < 3; i++)for(int j=-3; j < 3; j++) {
glPushMatrix();glTranslatef(i*10.0,0,j * 10.0);
drawSnowMan();glPopMatrix();
}
![Page 11: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/11.jpg)
DI-UM Computação Gráfica 08/09 11
Display Lists: Exemplo
• Display List contendo um bonecoSetup
snowManDL = glGenLists(1); glNewList(snowManDL,GL_COMPILE);
drawSnowMan();glEndList();
Utilizaçãofor(i = -3; i < 3; i++)
for(int j=-3; j < 3; j++) {glPushMatrix();glTranslatef(i*10.0,0,j * 10.0);
glCallList(snowManDL);glPopMatrix(); }
![Page 12: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/12.jpg)
DI-UM Computação Gráfica 08/09 12
Display Lists: Exemplo
• Display List com todos os bonecos de neve
SetupglNewList(loopDL,GL_COMPILE);for(int i = -3; i < 3; i++)
for(int j=-3; j < 3; j++) {glPushMatrix();glTranslatef(i*10.0,0,j * 10.0);drawSnowMan();glPopMatrix();
}glEndList();
UtilizaçãoglCallList(loopDL);
![Page 13: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/13.jpg)
DI-UM Computação Gráfica 08/09 13
Display Lists Hierárquicas
– Uma display list pode conter referências a outras display lists.
– A recursividade não é permitida.
– O nível de aninhamento, segundo a especificação, pode ir até 64.
![Page 14: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/14.jpg)
DI-UM Computação Gráfica 08/09 14
Display Lists Hierárquicas: Exemplo
Setup
loopDL = glGenLists(2);glNewList(loopDL+1,GL_COMPILE);
drawSnowMan();glEndList();
glNewList(loopDL,GL_COMPILE);for(int i = -3; i < 3; i++)
for(int j=-3; j < 3; j++) {glPushMatrix();glTranslatef(i*10.0,0,j * 10.0);glCallList(loopDL+1);glPopMatrix();
}glEndList();
![Page 15: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/15.jpg)
DI-UM Computação Gráfica 08/09 15
Display Lists: Desempenho
• Teste
– 100 cilindros
– número de triângulos de cada cilindro = {60,600,6000,60000}
– Pentium 4 2.53Ghz, 1GB DDR 400, GeForce TI 4800 SE
![Page 16: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/16.jpg)
DI-UM Computação Gráfica 08/09 16
Display Lists: Desempenho
• Resultados (fps)
1106
1227
1227
6000 60.000 600.000 6.000.000
212
250
251
22.77
77.53
77.53
2.17
7.91
7.91
Sem DL
DL simples
DL Hierárquica
![Page 17: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/17.jpg)
DI-UM Computação Gráfica 08/09 17
Display Lists
• Uma display list é estática.
– => Não é possível editar os comandos de uma display list.
– Motivo: A edição de uma DL podia provocar fragmentações de memória, e implicaria uma gestão de memória mais exigente.
![Page 18: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/18.jpg)
DI-UM Computação Gráfica 08/09 18
Desempenho
• Tópicos:
– Display Lists
– Vertex Buffer Objects
![Page 19: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/19.jpg)
DI-UM Computação Gráfica 08/09 19
Vertex Buffer Objects
• São necessárias 3n invocações de funções para submeter n triângulos com coordenadas de textura e normais. (GL_TRIANGLES)
• Se o mesmo vértice é partilhado por vários triângulos tem ainda assim que ser submetido uma vez por cada triângulo
• Objectivo dos VBOs: eliminar o tempo de submissão
• Processo:
– Definir arrays para coordenadas, coordenadas de textura e normais
– Submeter os arrays uma única vez, ficando estes a residir na placa gráfica
– Desenhar com uma única invocação
![Page 20: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/20.jpg)
Vertex Buffer Objects
DI-UM Computação Gráfica 08/09 20
Um cubo tem 8 vértices.Como cada face é especificada separadamente temos que especificar 24 vértices.Cada vértice tem 3 dimensões, logo 72 floats
float vert[72]={-1., -1., 1., …}
X
X
Y
YZ
Z
1º vértice
2º vértice
![Page 21: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/21.jpg)
Vertex Buffer Objects
• Passo 1 - Criação dos arrays e activar funcionalidade
– Alocar arrays para vértices, normais, ... float vert[72]={-1., -1., 1., …}
– Activar Buffers
glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_NORMAL_ARRAY);
DI-UM Computação Gráfica 08/09 21
![Page 22: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/22.jpg)
• Passo 2: Gerar VBOsGLuint buffers[n];
...
glGenBuffers(n, buffers);
glBindBuffer(GL_ARRAY_BUFFER,buffers[0]);
glBufferData(GL_ARRAY_BUFFER,arraySize, vert, GL_STATIC_DRAW);
//glBindBuffer(GL_ARRAY_BUFFER,buffers[1]);
//glBufferData(GL_ARRAY_BUFFER, arraySize, normalB, GL_STATIC_DRAW);
glBufferData() copia os dados do espaço do cliente (aplicação)
para o do servidor (driver gráfico, GPU, etc.)
Vertex Buffer Objects
DI-UM Computação Gráfica 08/09 22
![Page 23: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/23.jpg)
Vertex Buffer Objects
• Passo 3: Atribuir Semântica
– Indicar para cada buffer qual a sua utilização– Define quais os arrays a serem desenhados
glBindBuffer(GL_ARRAY_BUFFER,buffers[0]); glVertexPointer(3,GL_FLOAT,0,NULL);
//glBindBuffer(GL_ARRAY_BUFFER,buffers[1]);
//glNormalPointer(GL_FLOAT,0,NULL);
DI-UM Computação Gráfica 08/09 23
![Page 24: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/24.jpg)
Vertex Buffer Objects
• Passo 4 : Desenhar com VBOs
glDrawArrays(mode, first, count);
mode: GL_TRIANGLES, GL_TRIANGLE_STRIP ...
• glDrawArrays() percorre o array a partir da entidade first e desenha count entidades sequencialmente
DI-UM Computação Gráfica 08/09 24
![Page 25: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/25.jpg)
Vertex Buffer Objects
• Desta forma enviam-se tantos vértices como no modo imediato.
• Através da utilização de índices é possível reutilizar vértices.
• Os índices também podem ser armazenados de forma optimizada (isto é no driver ou GPU).
DI-UM Computação Gráfica 08/09 25
![Page 26: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/26.jpg)
Vertex Buffer Objects
DI-UM Computação Gráfica 08/09 26
Um cubo tem 8 vértices. Precisamos de 24 floats
Como cada face é especificada separadamente temos que especificar 24 índices.
float vert[24]={-1., -1., 1., …}
int ind[24]={0, 1, 2, 3, 1, 4, 5, 2, …}
0 1
23
4
5
1ª face 2ª face
![Page 27: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/27.jpg)
Vertex Buffer Objects
• Define-se um array para os índices dos vértices a desenhar.
glDrawElements(modo, count, tipo, indíces);
– modo: GL_TRIANGLES, GL_TRIANGLE_STRIP, ...
DI-UM Computação Gráfica 08/09 27
![Page 28: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/28.jpg)
Vertex Buffer Objects
• Os índices também podem residir na placa:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffers[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size, pointer, GL_STATIC_DRAW);
Para desenhar:
glDrawElements(modo, count, tipo, 0);
DI-UM Computação Gráfica 08/09 28
![Page 29: António Ramires Fernandes & Luís Paulo Santos - Computação Gráfica 08/09 Computação Gráfica Desempenho.](https://reader035.fdocument.pub/reader035/viewer/2022070311/552fc11a497959413d8c97ec/html5/thumbnails/29.jpg)
DI-UM Computação Gráfica 08/09 29
Referências
• OpenGL Reference Manual, OpenGL Architecture Review Board.