Concordo com os livros acima com algumas notas:
O oitavo guia de programação do OpenGL foi lançado e foi refeito para o moderno OpenGL 4.3.
O SuperBible 5 ed fornece uma biblioteca de muletas para você começar, mas, ao ler o livro, você reimplementa a funcionalidade dessa biblioteca para que, ao final, você seja totalmente versado. Eu também recomendo agrupar coisas do OpenGL em algo se você estiver usando uma linguagem orientada a objetos. Estou trabalhando em minha própria biblioteca por diversão, o que parece ser o caminho a percorrer, implementando-a eu mesmo. Entendo todos os meandros e preciso apenas inserir os bits que realmente uso. Além disso, você pode abstrair algumas coisas, como enviar dados para shaders (não é mais brilhanteMaterial.setColor (Vermelho) muito melhor), isso também pode permitir o suporte de algumas coisas, fornecendo alternativas herdadas. Há também oglplus .
O principal problema com a aprendizagem moderna do OpenGL 'básico' é que, para instalar um pipeline básico, mesmo que seja apenas para desenhar um cubo, é necessário entender o seguinte:
- Operações de matriz (use o GLM se você estiver em C ++, você também precisará de uma versão do SDK não oficial do MatrixStack OpenGL aqui , ou da minha aqui .)
- Programação de shader GLSL.
- vinculando dados a shaders e objetos de buffer do vértice. Se você quisesse aprender apenas o perfil básico puro real, todos eles precisariam ser implementados simultaneamente e, se algo estiver quebrado, você não verá nada e quase não tem idéia de onde deu errado. Isso também não abrange itens como iluminação básica (onde você precisa aprender os algoritmos de sombreamento além da linguagem de programação).
Mas você não precisa começar no deependente com o perfil principal. Use algumas das funcionalidades descontinuadas no início, quase tudo ainda a suportará e depois modernize-a.
Outra questão é que o OpenGL 'moderno' pode realmente se referir a três coisas:
O primeiro é o pipline de shader programável, em oposição ao pipeline de função fixa. As principais técnicas 'modernas' são possíveis desde que o OpenGL 2.0 foi lançado em 2004, quando os shaders foram introduzidos (os tutoriais não foram atualizados) e também o 1.5 tinha o Vertex Buffer Objects, que é outra pedra angular do OpenGL moderno. Um problema é que ainda hoje os desenvolvedores do OpenGL podem nem mesmo tirar proveito disso, existem muitos netbooks ruins com chipsets Intel que suportam apenas o OpenGL 1.5 e telefones como iPhones / Android mais antigos que suportam apenas OpenGL ES 1.1. A única diferença real entre esse material no OpenGL 2.0 e no OpenGL 3.x / 4.x é agora obrigatório para o perfil principal.
O OpenGL moderno também pode se referir às novidades que estão na versão 3.x, 4.x. Coisas como objetos Vertex matriz , FrameBuffer objetos , uniformes tampão Objetos / std140 , qualificadores de layout , sub-rotinas GLSLe assim por diante. Muitos dos que encontrei podem tornar as coisas muito mais agradáveis para programar. Eles também podem alterar sutilmente seus oleodutos gerais do motor. Eles também são coisas que, com um pouco de esforço, você pode realizar o backport, criando funções auxiliares e assim por diante (por exemplo, escreva um objeto genérico de gerenciador de shader que você possa usar para definir uniformes, se houver suporte para UBOs que possam gerenciar o upload dos valores para shaders manualmente , talvez coloque um pouco de shader reescrevendo o material para automatizá-lo). Esse material é executado apenas em novas placas de vídeo; você não verá nenhum netbook suportando ou qualquer console de videogame da geração atual (eles usam seu próprio subconjunto do OpenGL semelhante ao OpenGL ES). O OSX mais recente possui apenas 3.
O UltraGL nextgen OpenGL. O OpenGL 4.3 acabou de ser lançado. Ele vem com shaders de computação, glMultiDrawElementsIndirect e buffers de armazenamento de shader. Isso permite um pipeline fundamentalmente diferente, no qual você carrega todos os dados de vértice na GPU e, em seguida, usa sombreadores de computação para calcular o que deve ser desenhado, em vez de fazê-lo em seu programa. Infelizmente, isso é muito novo, então não conheço nenhum tutorial decente sobre ele. Dê uma olhada na revisão do OpenGL 4.3, que fornece um esboço de como isso funciona (também o autor diz que há um artigo do GPU Pro a ser lançado explicando isso). Sendo novinho em folha, não será suportado em nenhum lugar neste estágio (a menos que você esteja em uma placa nvidia mais nova com drivers beta). Embora você possa usar o OpenCL / CUDA para implementar algumas delas.
Eu pularia glBegin, glEnd, glVertex *, glNormal *, glTextCoord *, glTranslate *, glRotate *, glLoadIdenity, glModelViewMatrix e assim por diante. Em vez disso, comece aprendendo Objetos de buffer do vértice sem sombreadores, não tente 3D neste momento apenas um triângulo branco liso, para que você não precise trabalhar com operações 3D usando matrizes (pois precisará aprender a vinculá-los a sombreadores em breve) não faz sentido aprender à maneira antiga). Em seguida, adicione os shaders, você precisará alterar como os objetos do buffer de vértice são vinculados, pois agora você deseja usar atributos de vértice. Aprenda a comunicar propriedades a eles por meio de uniformes. Em seguida, aprenda operações de matriz com o GLM, vincule as matrizes aos shaders e faça o 3D funcionar. Depois que você fizer isso, basicamente aprenderá coisas mais avançadas, como texturas,
Alguns tutoriais modernos gerais do OpenGL on-line, cobrindo o pipeline de programação de sombreadores que a maioria funciona com o OpenGL 2.0+:
Para outros recursos gerais de aprendizagem. O OpenGL ES pode ser um bom ponto de partida. O OpenGL ES retirou todo o material obsoleto. O OpenGL 4.1 tem total compatibilidade com o OpenGL ES, portanto, deve ser possível pegar um programa OpenGL ES e executá-lo no OpenGL 4.1. E os princípios básicos são os mesmos para ambos.
Algumas coisas a serem observadas é que o OpenGL ES 3.0 acaba de ser lançado, mas como é novo, ele ainda não possui tutoriais ou suporte de hardware. Parece não ter grandes mudanças fundamentais (como a diferença entre o modelo de pipeline fixo e shader que vimos no OpenGL ES 1.0-> 2.0). Então você provavelmente não estará aprendendo coisas desatualizadas.
Além disso, o OpenGL ES geralmente usa o EGL, portanto você precisará aprender outra maneira de abrir uma janela, mas isso não deve ser muito difícil. Caso contrário, existem alguns invólucros / emuladores do OpenGL ES disponíveis ou você pode aprender no Android / iPhone, se tiver um (ou usar os emuladores).
Existe o Guia de Programação Addison Wesley OpenGL ES 2.0, que é o equivalente ao livro vermelho.
Você também pode ver as coisas focadas no shader GLSL, já que é aí que vive a maioria dos modernos OpenGL. Você só precisa garantir que o que você aprenda cubra o lado da cola do OpenGL.
Confira a 2ª edição do OpenGL Shading Language (Orange Book).
O Livro de Receitas do OpenGL 4.0 Shading Language cobre algumas coisas mais avançadas do OpenGL, mas não é um tutorial abrangente. Definitivamente, vale a pena procurar entender as práticas OpenGL mais recentes do mundo real, como objetos de buffer uniformes e sub-rotinas GLSL.
Finalmente, você pode dar uma olhada no WebGL, apesar de estar em JavaScript que será um pouco diferente e muito mais difícil de depurar.