maior será a quantidade de pixels a serem desenhados. Outro modo de testar é desabilitandooperações de textura, fog, blending.Existem várias estratégias para se otimizar os estágios do pipeline. Algumas abordagens comprometem aqualidade em troca de desempenho e outras são apenas melhores estratégias de implementação:Otimização do Estágio da Aplicação: otimizações para tornar o código e acesso à memória maisrápidos. Isso pode ser obtido ativando-se flags de compilação e conhecendo detalhes das linguagensde programação. Algumas dicas gerais de código/memória são listadas. Para maiores detalhesconsulte [2]:o Evite divisões;o Evite chamar funções com pouco código. Use funções inline;o Reduzir uso de funções trigonométricas;o Usar float ao invés de double;o Usar const sempre que possível, para o compilador melhor otimizar o código;o Evitar uso excessivo de funções malloc/free.Otimização do Estágio de geometria: Pode-se aplicar otimizações apenas sobre transformações eiluminação.o Em relação a transformações, se o objeto precisar ser movido para uma posição estática, aoinvés de aplicar a transformação a cada renderização, pode-se aplicar as transformações emum pré-processamento antes da renderização iniciar;o Outra estratégia é reduzir ao máximo o número de vértices, com o uso de vertex array, ouprimitivas do tipo STRIP ou FAN;o Outra estratégia muito eficiente é aplicar culling, no estágio da aplicação;o Uso de LOD;o Reduzir o número de fontes luminosas;o Verificar quais partes da cena necessitam iluminação;o Iluminação flat é mais rápida que Gourdaud;o Avaliar se é necessário iluminar os dois lados das superfícies;o Uso de Light maps.Otimização do Estágio de Rasterização:o Habilitar backface culling para objetos fechados. Isso reduz o número de triângulos paraserem rasterizados em aproximadamente 50%;o Desenhar objetos mais próximos do observador primeiro. Isso evita gravações sucessivas noz-buffer;o Desabilitar recursos como fog, blending ou uso de filtros de textura mais baratos, como obilinear ao invés de mipmapping.Otimizações gerais:o Reduzir a geometria da cena;o Reduza a precisão em vértices, normais, cores e coordeandas de textura. Isso reduz uso dememória e uso de barramento;o Desabilitar recursos não utilizados;o Minimizar mudança de estados;o Evitar swap de texturas;o Use display lists para objetos estáticos.7.2. Avaliando o Desempenho do PipelineA velocidade de renderização depende do estágio mais lento, e é medida em FPS (frames por segundo). Paraeste cálculo, deve-se desabilitar o recurso de double-buffer, visto que a troca de buffer neste caso ocorre emsincronismo com o refresh do monitor.2
Com o double buffer ativado, enquanto o front buffer está sendo exibido, o back buffer está sendo gerado.Somente ocorre a troca de buffers (glutSwapBuffers) quando o monitor acabar de desenhar o framecorrente.Considerando-se o monitor com uma taxa de atualização de 72 Hz, significa que a cada t = 13. 8milisegundos a tela é atualizada. Com o recurso de double-buffer ativado, a taxa de atualização deve sermúltiplo deste valor. Se o tempo de renderização consome 20 ms (50 Hz) em single-buffer, a taxa cairá para2*13. 8 = 36 Hz com o double-buffer ativo. Neste caso, o pipeline gráfico fica inativo por 13. 8*2 – 20 =7.78 ms para cada frame [2].Monitor13.8 ms 13.8 ms 13.8 ms 13.8 ms13.8 msPipeline20 ms 7.78 ms 20 ms 7.78 ms20 msUma forma de contornar os problemas do uso do double-buffer é o uso de tiple-buffer. Neste caso existemdois back buffers e um front buffer. Neste caso, enquanto o monitor está exibindo o font buffer, podem estarsendo gerados 1 ou 2 back buffers. No caso do uso de double-buffer, o o refresh do monitor for de 60 Hz e otempo de geração das cenas for menor que 1/60 s, então mantém-se uma taxa de 60 fps. Porem se o tempo degeração for pouco maior que 1/60 s, a taxa de atualização cai para 30 fps. Com o uso de triple-buffer, a taxase mantém próxima de 60 fps. O inconveniente do uso de triple-buffer é que o tempo de resposta para açõesdo usuário é um pouco maior, especialmente se o fps for baixo.8. Tópicos adicionaisVários tópicos suportados pelo <strong>OpenGL</strong> não foram tratados neste material. Para detalhes sobre assuntoscomo blending, fog, antialiasing, bitmaps, quádricas, NURBS, picking, e extensões <strong>OpenGL</strong>, consulte [1].Para técnicas de renderização como sombras, efeitos especiais e técnicas de otimização, consulte [2].9. Referências Bibliográficas[1] "GLEW," 22 07 2013. [Online]. Available: http://glew.sourceforge.net/.[2] "opengl - How many VBOs do I use?," 28 12 2011. [Online]. Available:http://stackoverflow.com/questions/8661629/how-many-vbos-do-i-use.[3] "Vertex Specification Best Practices," 22 10 2012. [Online]. Available:http://www.opengl.org/wiki/Vertex_Specification_Best_Practices.[4] "Modifying only a specific element type of VBO buffer data?," 13 07 2011. [Online]. Available:http://stackoverflow.com/questions/6681871/modifying-only-a-specific-element-type-of-vbo-bufferdata.[5] "Vertex Specification," 8 8 2012. [Online]. Available: http://www.opengl.org/wiki/Vertex_Specification.[6] "<strong>OpenGL</strong> 4 Reference Pages," 19 09 2012. [Online]. Available:http://www.opengl.org/sdk/docs/man/xhtml/.[7] Woo, M.; Neider, J.; Davis, T.; Shreiner, D. <strong>OpenGL</strong>: Programming Guide. 5. ed. Massachusetts :Addison-Wesley, 2005.[8] Moller, T.; Haines, E.; Akenine, T. Real-Time Rendering. 2 ed. AK Peters, 2002.[9] Celes, W. Notas de Aula. PUC-Rio, 2006.[10] <strong>OpenGL</strong>.org, Vertex Specification. Disponível em:http://www.opengl.org/wiki/Vertex_Specification[11] oZone3D.Net, <strong>OpenGL</strong> Tutorials. Disponível em:http://www.ozone3d.net/tutorials/opengl_vbo_p2.php#part_262