O código reminescente do OpenGL 1.X ainda é muito usado atualmente, razão esta porque ainda existe o modo de compatibilidade no OpenGL 3.0+. Os códigos que serão apresentados aqui representam o básico da computação gráfica e por isso são de valia para quem quer começar ou aprender sobre OpenGL, mas não quer ir direto na alta complexidade das versões mais atuais do OpenGL.
No entanto, algumas ressalvas irão ser colocadas aqui. Ainda que códigos de OpenGL 2.0+ possam ser acessados como extensões em relação ao openGL 1.x eles não serão mostrados aqui. (Entenda-se por isso principalmente a parte de shaders).
Além disso, também haverá um pouco de teoria aqui para situar o leitor/curioso sobre que a amostra de código faz.
Quando pertinente, haverá links para outros sites ou para referências a outras seções/códigos deste site/wiki.
Máquina de estados
O OpenGL pode ser visualizado como uma máquina de estados, ou seja. Dado que em certo momento você ordenou que a cor de desenho atual seja o azul, a menos que você ordene o contrário, todas as primitivas desenhadas de agora em diante serão azuis. Esta máquina ressalta duas características importantes do OpenGL: sua simplicidade e sua "amnésia". Primeiro a simplicidade se deve por não haver um mecanismo complexo para que as "coisas" comecem a funcionar, basta emitir a função ou as funções relacionadas que o estado mudará instantaneamente para os comandos subsequentes). No tocante à amnésia, isto se deve a OpenGL ser uma API procedural e não orientada a objeto, pois foi assim concebida originalmente. Todavia, com a chegada de shaders, a evolução para OpenGL 2.0 e posteriores a máquina de estados vai perdendo cada vez mais importância, pois cada vez mais está se trocando o hardware de função fixa por um pipeline programável e dinâmico.
A mudança de estado geralmente ocorre através de uma das funções glEnable ou glDisable.
Primitivas
Antes de começar qualquer desenho, primeiramente devemos saber quais tipos de desenho o OpenGL suporta e como ele faz o desenho.
Primeiramente há duas coisas necessárias para a especificação do desenho que são no primeiro momento dizer ao OpenGL qual a primitiva a ser desenha e depois configurar a cor e a localização de cada um dos vértices da primitiva.
A especificação da primitiva se faz através do par glBegin e glEnd, sendo a primitiva um parâmetro de glBegin. Já a localização dos vértices é feita através de glvertex[tv] e a especificação das cores através de glColor[tv], onde as letras t e v especificam detalhes importantes da função e serão descritas mais adiante.
Em relação às primitivas cada uma delas será discutida brevemente e algumas dicas serão dadas
Pontos
A primitiva que representa pontos é GL_POINTS. Quando desenhando pontos Cada vértice definido correspondente a um ponto isolado no espaço.
Linhas
Linhas são representadas pela constante GL_LINES. Linhas são definidas através de 2 vértices que são interpretados como as extremidades da linha. cada par de vértices é independente dos pares de vértice declarados anteriormente. Caso haja um número ímpar de vértices especificados, o vértice sem par é descartado pelo driver da placa de vídeo
Tiras de linha
Tiras de linha são semlhantes às linhas, exceto por dois detalhes. O primeiro é que este primitivo é especificado por GL_LINE_STRIP e o segundo é que um dado vértice age como o ínicio de uma linha, mas também como o final de outra iniciada pelo vértice declarado anteriormente.
Uma das finalidades para este primitivo é o desenho de círculos, uma vez que tais primitivos não estão disponíveis prontamente com o OpenGL. Ver exemplo posterior
Loops de linha
Um loop de linha é definido por GL_LINE_LOOP e tem comportamento quase idêntico ás tiras de linha, salvo por um único detalhes. O último de todos os pontos definidos é conectado ao primeiro de todos.
Triângulos
Especificado por GL_TRIANGLES e definido por três vértices consecutivos, sendo que o quarto vértice e posteriores são independetes desses já especifcados e formam novos triângulo por agrupamento de três em três. Vértices soainhos ou em dupla são descartados pelo driver OpenGL.
Tiras de triângulo
"Leques" de triãngulo
Quadriláteros
Tiras de quadrado
Polígonos
Exemplos de código
#include <GL/freeglut.h> #include <GL/gl.h> #include <GL/glext.h> void display(){ glClear( GL_COLOR_BUFFER_BIT ); // desenha em vermelho glColor3f( 1.0f, 0.0f, 0.0f ); glBegin( GL_TRIANGLES ); glVertex2d( 0.5, 0.5 ); glVertex2d( 0.5, 0.1 ); glVertex2d( 0.1, 0.1 ); glEnd(); glFlush(); } void changeViewport( int width, int height){ } void setup(){ // limpa a tela com a cor azul glClearColor( 0.0f, 0.0f, 1.0f, 1.0f ); } int main( int argc, char **argv ){ glutInit( &argc, &argv ); glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB); glutInitWindowSize( 800, 600 ); glutCreateWindow( "Simples" ); glutDisplayFunc( display ); setup(); glutMainLoop(); return 0; }
