OpenGL

API dedicada a gráficos 3D, muito conhecida. Ela é um padrão aberto gerenciada agora pelo Khronos group e muito usada em jogos e nos mais variados aplicativos comerciais ou não. Além disso é muito plataforma e conta com amplo suporte dos fabricantes de placa 3D para oferecer aceleração de vídeo por hardware.

opengl_animated.gif
(Retirado da página oficial do OpenGL: http://www.opengl.org)

Extensões OpenGL

A API núcleo do OpenGL não é suficiente para que todas as características do hardware gráfico de um determinado fabricante sejam expostas ao desenvolvedor, por isso há o mecanismo de extensão OpenGL. O mecanismo de extensão OpenGL é, em poucas palavras, um mecanismo que possibilita ao fabricante de hardware gráfico, expôr funções que são próprias do seu hardware ao desenvolvedor. Ele usa algumas funções dependentes de plataforma que realizam consulta as extensões OpenGL disponíveis, permitindo o uso delas.
As vantagens do mecanismo de extensão é o acesso imediato a características específicas de hardware não definidas no padrão, usadas para melhorar o desempenho ou que permitam o uso de um recurso específico que de outra maneira não seriam possível. Em contrapartida, as desvantagens são a dependência de hardware e a necessidade de se mexer com funções dependentes de plataforma para ter acesso a tais funcionalidades.
Felizmente há algumas bibliotecas que facilitam a manipulação de extensões OpenGL, dentre elas a Biggle, a GLew e a GLee.

GLUTDoubleBuffer Exemplo de double Buffer em GLUT
GLUTCamera Movimentacao da Camera com auxilio do GLUT
GLUTOverlay Colocando overlays na aplicacao

Codigo que poe um retangulo 2D na tela com a ajuda da API GLUT (Este código foi tirado do livro OpenGL the SuperBible em sua Segunda edição)

#include <GL/glut.h>

// Called to render scene
void renderScene(){
    glClear(  GL_COLOR_BUFFER_BIT );

    // set the current drawing color to red
    glColor3f( 1.0f, 0.0f, 0.0f );

    // draw a filled rectangle with current color
    glRectf( -25.0f, 25.0f, 25.0f, -25.0f );

    // flush drawing commands
    glFlush();
}

// setup the rendering state
void setupRC(){
    glClearColor( 0.0f, 0.0f, 1.0f, 1.0f );
}

// called by GLUT library when the windows has changed size
void changeSize( GLsizei w, GLsizei h ){
    GLfloat aspectRatio;

    if( h == 0 ) h =1;

    // set the viewport to windows dimensions
    glViewport( 0, 0, w, h );

    // reset coordinate system
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();

    // Establish clipping volume
    aspectRatio = (GLfloat) w/ (GLfloat)h;

    if( w <= h )
        glOrtho( -100.0, 100.0, -100/aspectRatio, 100.0/aspectRatio, 1.0, -1.0 );
    else
        glOrtho( -100.0 * aspectRatio, 100.0 * aspectRatio, -100, 100.0, 1.0, -1.0 );

        glMatrixMode( GL_MODELVIEW );
        glLoadIdentity();
}

int main(){
    glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB );
    glutCreateWindow( "GLRect" );
    glutDisplayFunc( renderScene );
    glutReshapeFunc( changeSize );

    setupRC();

    glutMainLoop();

    return 0;
}

Trechos de Código OpenGL

Trechos de código de funcionalidades utilitárias em OpenGL: Trechos de Código OpenGL

OpenGL 1.x

Primeira versão do OpenGL datada de 1992. Fundamentalmente constitue-se do pipeline de função fixa que veio se aprimorando até a versão 1.5

Alguns trechos de código OpenGL 1.0 estão disponíveis na página Tutorial OpenGL 1.x

OpenGL 2.0

Introdução do pipeline programável no núcleo da especificação (GLSL).

OpenGL 2.1

OpenGL 3.0

Tentativa de melhorar a API marcando algumas características como depreciadas e criando perfis. Sua intenção original era abolir a funcionalidade fixa, sendo propagandeada como a API da revolução OpenGL, mas que acabou não sendo cumprida pela funcionalidade fixa já estar consolidada e pelo grande uso que vendedores CAD fazem dela. Esta versão do OpenGL tem o objetivo de se igualar ao DirectX 10

OpenGL 3.1

OpenGL 3.2

OpenGL 3.3

OpenGL 4.0

Especificaćào do openGL para se equivaler ao DirectX 11 e como consequência introduzem como mais importante o estágio de tesselaćào com os 2 shaders (ver o nome equivalente em OpenGl 4 dos shaders DX11-hull shader e domain shader). As suas primeiras implementaćões por parte dos principais fabricandes de placa de vídeo gráfica (NVidia e ATI) datam de abril de 2010.

OpenGL 4.1

As novas características do OpenGL 4.1 estão relacionadas principalmente às tecnologias correlatas OpenCL e WebGL. Ela incorpora dentro de si extensões de OpenGL ES 2.0, fazendo da API OpenGL 4.1 um superconjunto da API OpenGL ES.

OpenGL 4.2

Atualização do OpenGl que expõe algumas novas características como o suporte a operações atômicas.

OpenGL 4.3

Atualização do OpenGL anunciada oficialmente na Siggraph 2012 cuja principal novidade é a introdução de Compute Shaders. ** TODO: (Falar sobre COmpute Shader) **

O pipeline do OpenGL a partir da versão 4.3 ficou da seguinte forma:

flickr:8126748846
Fonte: Christofer Riccio (http://www.g-truc.net/)

OpenGL 4.4

O OpenGL 4.4 é a versão do OpenGL lançada na Siggraph 2013.

OpenGL 4.5

O OpenGL 4.5 traz como principal novidade a característica DSA (Direct State Access) de extensão para o núcleo da API.

OpenGL 4.6

A versão 4.6 da API traz em seu core a possibilidade de se compilar shaders que foram definidos usando SPIR-V.

Vulkan

Vulkan é o nome da API antes conhecida como GLnext. Basicamente ela é uma API que interage com OpenCL e busca uma maior integração com o hardware, fazendo o programador ser responsável por detalhes como gerência de memória e outros relaiconados em troca da possibilidade de maior eficiência para a execução das tarefas visuais/computacionais executadas pela GPU. Sua inspiração são as APIs mais novas com este mesmo objetivo, como Metal, DirectX 12 e Mantle.

Links

https://www.khronos.org/assets/uploads/developers/library/overview/2015_vulkan_v1_Overview.pdf: Panorama do que é e como está a API Vulkan até momento

https://www.khronos.org/vulkan: SIte oficial da API Vulkan

Links

Comentário das novidades introduzidas pela versão 4.2 do OpenGL: https://docs.google.com/document/d/1kFzd9eZikZoAIKdDTkPo2i3OVeq4u8JZkmmIkdXDRNM/edit?hl=en_US&pli=1

Vertex Buffer Objects (VBOs)

VBOs é a forma atual que a API openGL adota para passar vértices do aplicativo para a placa de vídeo. Eles possibilitam o armazenamento dos dados dos vértices na própria placa de vídeo.
Veja mais em: http://www.opengl.org/wiki/Vertex_Buffer_Object

Index Buffer Objects (IBOs)

IBOS são buffers de indices usados juntos com VBOs. O papel deles é evitar que vertices repetidos sejam especificados, listando apenas os indices no array dos vertices que compõem os primitivos sendo renderizados. Com isso se ganha em diminuição da banda consumida para especificar os objetos na GPU, além de um consumo de mmemória reduzida, uma vez que modelos 3D tendem a ter diversos vértices repetidos, e cada vértice contendo várias informações como cor, posição, etc. No lugar de especificar novamente o mesmo vértice, apenas um inteiro representando um indíce é necessário para especificá-lo.

FrameBuffer Objects (FBOs)

FrameBuffer Objects são buffers que a API OpenGL permite criar para desempenhar a função de RenderToTexture, isto é renderizar a cena para uma textura ao invés de para a tela. A vantagem de FBOs perante a função glGetPixels (ver se este é o nome da função) e dos PBuffers é que os FBOs são objetos que residem na placa de vídeo e permitem que a renderização saia diretamente para a textura sem necessitar de nehum processo intermediário, sendo desta maneira mais eficientes do que as outras abordagens citadas.

Relacionados

Glut Gl Utility Toolkit Biblioteca que fornece a possibilidade de se criar GUI (Janelas) além de interagir com os dispositivos de I/O
Glew Biblioteca que facilita o carregamenta de extensões OpenGL
Biggle Outra biblioteca para o carregamento fácil de extensões OpenGL, mas limitada a executar apenas em ambiente Windows

Ferramentas

GlDebuger

GL Debugger é um debugador especializado em OpenGL. Produto antes pago, agora pode ser obtido gratuitamente em http://www.gremedy.com/purchase.php

glsl devil

GLSL devil é uma outra ferramenta criada para depuração de scripts OpenGL, apesar de descontinuada. http://cumbia.informatik.uni-stuttgart.de/glsldevil/

GLINtercept

Um interceptador de chamas OpenGL feito paa Windows. http://code.google.com/p/glintercept/

APITrace

Traça o estado openGL, permite a visualização de renderbuffers, e algumas outras funcionalidades para visualização dos dados mandados para rendering http://apitrace.github.io/

GL-Z

Utilitários simples para informação OpenGL - http://www.geeks3d.com/20141121/gl-z-opengl-information-utility-extensions-viewer-for-windows-linux-and-os-x/

GShaderReplacer

Emula OpenGL32.dll para poder agarrar os códigos-fonte de shaders de um pacote executável.

http://www.pouet.net/prod.php?which=54015

Nvidia Graphics Debugger

Agora disponível também para Ubuntu Linux: https://developer.nvidia.com/content/debug-and-profile-opengl-4x-linux-nvidia-linux-graphics-debugger-10-now-available-download

SHaderSandbox

Editor de shaders em tempo real.
Link: http://ludumdare.com/compo/2015/03/25/shadersandbox-generate-images-using-glsl-shaders/

ShaderGen

Conforme o site: "ShaderGen é uma ferramenta que automaticamente gera shaders na OpenGL Shading Language shaders que duplicam o comportamento do OpenGL de funcionalidade fixa".
Link:https://github.com/mojocorp/ShaderGen

GApiD

Google API Dbeugger é um Debugger para as APIs OpenGL e Vulkan, feito pelo Google
Link: https://github.com/google/gapid

Tutoriais

Tutorial OpenGL 1.X
Tutorial OpenGL 3.x +
Tutoriais OpenGL 3.x+ from Mb
http://www.spieleprogrammierung.net/ Tutoriais de OpenGL 3 em alemão
introdução para OpenGL
http://www.videotutorialsrock.com/opengl_tutorial/backface_culling/video.php Video-tutoriais sobre OpenGL
http://www.opengl-tutorial.org/ Uma página com vários tutoriais em OpenGL 3.3

Game engines que suportam OpenGL

Irrlicht
Ogre 3D
Crystal Space 3D
JMonkeyEngine Engine baseada em Java
http://www.klayge.org/ (Engine que roda em cima de OpenGL 4.1 e OpenGL ES2.0 - verificar)

Livros

TODO (colocar depois os links para sites que vendem os livros em questão)

http://openglbook.com/

Livro Online sobre OpenGL

OpenGL SuperBible

Livro de referência de OpenGL que está atuamente na sexta edição. Nesta última edição é incluso compute shaders e outros recursos da API OpenGL 4.3.

http://www.arcsynthesis.org/gltut/

livro online com bastante conteúdo sobre OpenGL de nova geração (3.0+)

++http://www.packtpub.com/article/tips-tricks-getting-started-with-opengl-glsl-4:

Um livro de leitura mais leve sobre OpenGL 4 (cookbook)

http://www.opengl.org/documentation/books/

Este link se encontra no site oficial do openGL e exibe uma coletânea de links para diversos livros sobre a tecnologia

TODO Colocar mais livros que falam sobre OpenGL

amostras de código

http://www.opengl.org/resources/code/samples/redbook/

Tecnologias Relacionadas

A API OpenGL tem duas APIs "primas", a OpenGL ES - OpenGL para dispositivos móveis e embutidos, e a WebGL - OpenGL para Web via javascript.

Ha formatos livres para descrever cenas em 3D, dois dos quais sao collada e [[[glTf]]

Ainda, pode-se usar a GPU para fazer outras computacoes, sejam elas graficas ou nao, e que dependendo do fabricante, pode haver interoperabilidade com OpenGL. API para isso (GPGPU) sao: OpenCL, a "prima" de OpenCL para a internet - WebCL - e, por último, CUDA.

Outras APIS

GUIs

Ha varias opcoes de bibliotecas de GUI em modo imediato feitas pela comunidade para serem utilizado em conjunto com OpenGL. Algumas delas sao:

Cargas de modelo

Ha algumas bibliotecas que voce pode usar para carregar modelos 3D em openGL:

Links dentro do site

Bibliotecas para OpenGL
Programas auxiliares para OpenGL
Benchmarks
OpenGL ES
WebGL

Links

Tutoriais

http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Table-of-Contents.html introdução para OpenGL
http://www.opengl-tutorial.org/
http://www.spieleprogrammierung.net/ Tutoriais de OpenGL 3 em alemão
http://nehe.gamedev.net Site muito bom com bastante tutoriais de OpenGL
http://nopper.tv/opengl.html Vários exemplos de OpenGL 3/4
http://www.lighthouse3d.com/ Um site com muito material sobre OpenGL
http://blog.virtualglobebook.com/p/resources-for-new-graphics-developers.html várias referências para aprendizado de OpenGL principalmente 3.x
http://ogldev.atspace.co.uk/ Tutoriais de OpenGL para Linux
http://www.mbsoftworks.sk/index.php?page=tutorials&series=1 tutoriais opengl 3.x para windows
http://opengltr.blogspot.com/ em turco
http://wili.cc/blog/opengl-cs.html exemplo de Computer Shader (OpenGL 4.3+)
http://open.gl/ outro site sobre tutorial OpenGL 3.2+
http://www.arcsynthesis.org/gltut/ livro online sobre programação gráfica moderna usando para seus exemplos OpenGL 3+
http://opengl.datenwolf.net/gltut/html/index.html livro online sobre programação gráfica moderna usando para seus exemplos OpenGL 3+

Site oficial e especificações

http://www.openGl.org site oficial da API
http://www.opengl.org/registry/ Página com as especificações tanto do núcleo quanto das extensões OpenGL

Bindings

http://jogl.dev.java.net Site sobre JOGL - Java Bindings for OpenGL
http://www.lwjgl.org Site sobre JOGL - Outra Binding de Java para OpenGL
http://sourceforge.net/projects/pyopengl/files/ PyOpenGL
http://sourceforge.net/projects/ogl4net/ - Opengl4Net - Empacotador para acessar OpenGL 4.3 de código .Net
http://www.opentk.com/ - Binding de OpenGL, OpenCL e OpenAL para C#
https://github.com/cginternals/glbinding - Um binfing C++ para a API OpenGL API gerado usando a especificacao gl.xml

Outros

http://glsdk.sourceforge.net/ OpenGL SDK (bibliotecas para auxílio na programação OpenGL)
http://delphigl.de/glcapsviewer/listreports.php Lista as capacidades das placas de vídeo OpenGL em diversas plataformas
http://www.space-combat-and-strategy.spieleprogrammierung.net/ - Como fazer jogo de combate espacial e estratégia suando OpenGL (em alemão)
http://web.eecs.umich.edu/~sugih/courses/eecs487/common/notes/APITables.xml Funções openGL e "em que OpenGL" elas estão presentes (WebGL, OpenGL e OpenGL ES).

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-Share Alike 2.5 License.