Está en la página 1de 14

Uso eficiente del hardware

Modos de funcionamiento

Difieren básicamente en cómo


se divide la carga del trabajo
entre la CPU y la GPU
Funcionamiento
● Modo inmediato
● Las primitivas son enviadas al pipeline y
desplegadas una a una.
● No hay memoria de las entidades gráficas
que pasaron.
● Ejemplo:
glTexCoord3f(...);
glVertex3f(...); //primer vértice
glTexCoord3f(...);
glVertex3f(...); //segundo vértice
Funcionamiento
● Vertex Arrays
● Se pueden ejecutar muchas primitivas
gráficas con
● una sola llamada a OpenGL.
Los datos se almacenan en buffers de
● estructura fija, lo que permite una gran
optimización.
Los vertex arrays proveen mejor rendimiento
de las aplicaciones porque formatean los
datos para un mejor acceso de memoria.
Funcionamiento
● Vertex Arrays (cont.)
● Cuando se dibuja un cubo, se tiene que transmitir 3
veces la información de cada vértice

● Usando vertex arrays se almacena la información


de cada vértice sólo una vez en el hardware
gráfico, que luego se la puede utilizar varias veces
(menos invocaciones a funciones de OpenGL)
Funcionamiento
● Vertex Arrays (cont.)
● Se pueden manejar hasta 6 arrays con información

– VERTEX_ARRAY
– COLOR_ARRAY
– NORMAL_ARRAY
– TEXTURE_COORD_ARRAY
– EDGE_FLAG_ARRAY
– INDEX_ARRAY
Ejemplo 1
glDrawArrays
● Vertex Arrays (cont.)
● Ejemplo
GLfloat colores[9*3] = {...}; //9 colores
GLfloat vertices[9*3] = {...}; //9 vértices

glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY):
glColorPointer(3,GLFloat,0,colores);
glVertexPointer(3,GLFloat,0,vertices);
glDrawArrays(GL_TRIANGLES,0,9);
Ejemplo 2
glDrawElements
GLfloat colores[7*3] = {...}; //7 colores
GLfloat vertices[7*3] = {...}; //7 vértices
Glubyte indices[3*3] = {...}; //3 triángulos
// { A,B,C, C,D,E, E,F,G }
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY):
glColorPointer(3,GLFloat,0,colores);
glVertexPointer(3,GLFloat,0,vertices);
glDrawElements(GL_TRIANGLES, 9,
GL_UNSIGNED_BYTE, indices);
Vertex Buffer Object (VBO)
• Mejora el desempeño logrado con Vertex
Arrays.
• Hace una mejor utilización de la tarjeta
gráfica.
• Es la estrategia utilizada hoy en día por los
programadores OpenGL.
Vertex Buffer Object (VBO)
• Ofrece 9 distintos modos de uso:
GL_STATIC_DRAW_ARB
GL_STATIC_READ_ARB
GL_STATIC_COPY_ARB
GL_DYNAMIC_DRAW_ARB
GL_DYNAMIC_READ_ARB
GL_DYNAMIC_COPY_ARB
GL_STREAM_DRAW_ARB
GL_STREAM_READ_ARB
GL_STREAM_COPY_ARB
Vertex Buffer Object (VBO)
• "Static" significa que los datos del modelo no
van a cambiar (se especifican una vez y se
utilizan muchas veces)
• "dynamic“ significa que los datos del modelo
van a cambiar frecuentemente.
• "stream" significa que los datos del modelo van
a cambiar en cada frame.
• “draw" significa que los datos se enviarán hacia
la GPU para ser dibujados en pantalla.
• "read" significa que los datos resultantes van a
ser leidos desde la GPU-
• "copy" significa que los datos van a ser
dibujados y leidos por igual

También podría gustarte