Tutorial OpenGL v3.0
Nesse artigo, trago-lhes a biblioteca SFML junto com OpenGL.
Parte 2: Primeira integração do OpenGL com o SFML
Vamos logo a um exemplo:
Compile com:
g++ PrimeiraJanela.cpp -o PrimeiraJanela `pkg-config sfml-all --cflags --libs` -lGL -lGLU
O código já está comentado, mas vou explicar também:
#include <SFML/OpenGL.hpp> :: Inclui a biblioteca do OpenGL;
#include <SFML/Graphics.hpp> :: Inclui a biblioteca Gráfica do SFML;
void inicializaOpenGL(void) :: A função está de volta. Ela é responsável por definir os parâmetros padrões do OpenGL.
glClearColor(255.0f, 255.0f, 255.0f, 1.0f); :: Define a cor de limpar a tela para branco.
glMatrixMode(GL_PROJECTION); :: Avisa o OpenGL que qualquer alteração futura afetará a câmera (o observador).
glLoadIdentity(); :: Reinicia todas as transformações e/ou rotações.
gluOrtho2D(0,400,400,0); :: Define o plano cartesiano começando em (0,0) no canto superior esquerdo.
glMatrixMode(GL_MODELVIEW); :: Avisa o OpenGL que qualquer alteração futura afetará o/os desenho/desenhos
glClear(GL_COLOR_BUFFER_BIT); :: "Limpa" a tela usando a cor de "limpar" a tela.
int main(void) :: Função padrão.
sf::RenderWindow janela (sf::VideoMode(400,400),"Teste com OpenGL"); :: Cria a variável "janela" com 400x400 e com o título "Teste com OpenGL".
bool estaRodando = true; :: Variável para indicar se o programa está ou não rodando.
sf::Event evento; :: Variável de eventos.
inicializaOpenGL(); :: Chamamos a função para inicializar o OpenGL.
while(estaRodando) :: Enquanto estiver rodando.
while(janela.pollEvent(evento)) :: Enquanto haver eventos coloque na variável evento.
if(evento.type == sf::Event::Closed) :: Se apertou no "X" da janela.
estaRodando = false; :: estaRodando recebe falso.
janela.display(); :: Atualiza o Duplo Buffer (caso ativado) e mostra na tela.
janela.close(); :: Encerra a janela.
return 0; :: Ocorreu tudo bem. ;)
Bom, se forem comparar com o artigo de SFML, verão que não mudou quase nada, só na parte da função do OpenGL, mas o que eu quero dizer: Não precisa fazer alterações na criação da janela para utilizar o OpenGL (mas é possível):
Se fizer isso antes de criar a janela e modificar um pouco o VideoMode, terá suas configurações "desejadas".
Agora, se quiser saber quais atributos já estão ativados, só fazer isso depois de criar a janela:
Bom, com essa parte, já podemos criar a janela. A partir daqui, a coisa fica "interessante"...
#include <SFML/OpenGL.hpp>
#include <SFML/Graphics.hpp>
// Funcao para inicializar o OpenGL
void inicializaOpenGL(void){
// Define a Cor de 'limpar' para Branco usando
// Red Blue Green Alpha
glClearColor(255.0f, 255.0f, 255.0f, 1.0f);
// Avisa o OpenGL que qualquer alteração futura
// afetará a Câmera ( O Observador)
glMatrixMode(GL_PROJECTION);
// Reinicia todas as transformações e/ou rotações
glLoadIdentity();
// Define a projeção cartesiana 2D iniciando de (0,0)
// No Lado Superior Esquerdo (ficando igual a projeção do SDL 'puro')
gluOrtho2D(0,400,400,0);
// Avisa o OpenGL que qualquer alteração futura
// afetará o/os desenho/desenhos
glMatrixMode(GL_MODELVIEW);
// 'Limpa' a tela usando a cor de 'limpar' a tela
glClear(GL_COLOR_BUFFER_BIT);
}
int main(void){
// Cria uma janela de 400x400 com o titulo "Teste com OpenGL"
sf::RenderWindow janela (sf::VideoMode(400,400),"Teste com OpenGL");
// Variavel booleana para indicar se o programa "estaRodando"
bool estaRodando = true;
// Variavel para Eventos
sf::Event evento;
// Inicializa o OpenGL
inicializaOpenGL();
// Main Loop
while(estaRodando){
// Se existir eventos coloca na variavel
while(janela.pollEvent(evento)){
// Se foi clicado no 'X' da janela
if(evento.type == sf::Event::Closed){
// "estaRodando" é falsa
estaRodando = false;
}
}
// Comecar o OpenGL aqui
janela.display();
}
janela.close();
return 0;
}

g++ PrimeiraJanela.cpp -o PrimeiraJanela `pkg-config sfml-all --cflags --libs` -lGL -lGLU
O código já está comentado, mas vou explicar também:
#include <SFML/OpenGL.hpp> :: Inclui a biblioteca do OpenGL;
#include <SFML/Graphics.hpp> :: Inclui a biblioteca Gráfica do SFML;
void inicializaOpenGL(void) :: A função está de volta. Ela é responsável por definir os parâmetros padrões do OpenGL.
glClearColor(255.0f, 255.0f, 255.0f, 1.0f); :: Define a cor de limpar a tela para branco.
glMatrixMode(GL_PROJECTION); :: Avisa o OpenGL que qualquer alteração futura afetará a câmera (o observador).
glLoadIdentity(); :: Reinicia todas as transformações e/ou rotações.
gluOrtho2D(0,400,400,0); :: Define o plano cartesiano começando em (0,0) no canto superior esquerdo.
glMatrixMode(GL_MODELVIEW); :: Avisa o OpenGL que qualquer alteração futura afetará o/os desenho/desenhos
glClear(GL_COLOR_BUFFER_BIT); :: "Limpa" a tela usando a cor de "limpar" a tela.
int main(void) :: Função padrão.
sf::RenderWindow janela (sf::VideoMode(400,400),"Teste com OpenGL"); :: Cria a variável "janela" com 400x400 e com o título "Teste com OpenGL".
bool estaRodando = true; :: Variável para indicar se o programa está ou não rodando.
sf::Event evento; :: Variável de eventos.
inicializaOpenGL(); :: Chamamos a função para inicializar o OpenGL.
while(estaRodando) :: Enquanto estiver rodando.
while(janela.pollEvent(evento)) :: Enquanto haver eventos coloque na variável evento.
if(evento.type == sf::Event::Closed) :: Se apertou no "X" da janela.
estaRodando = false; :: estaRodando recebe falso.
janela.display(); :: Atualiza o Duplo Buffer (caso ativado) e mostra na tela.
janela.close(); :: Encerra a janela.
return 0; :: Ocorreu tudo bem. ;)
Bom, se forem comparar com o artigo de SFML, verão que não mudou quase nada, só na parte da função do OpenGL, mas o que eu quero dizer: Não precisa fazer alterações na criação da janela para utilizar o OpenGL (mas é possível):
Se fizer isso antes de criar a janela e modificar um pouco o VideoMode, terá suas configurações "desejadas".
sf::ContextSettings confOpenGL; confOpenGL.depthBits = 24; confOpenGL.stencilBits = 8; confOpenGL.antialiasingLevel = 4; confOpenGL.majorVersion = 3; confOpenGL.minorVersion = 0; sf::RenderWindow janela (sf::VideoMode(400,400),"Teste com OpenGL",sf::Style::Default,confOpenGL);
Agora, se quiser saber quais atributos já estão ativados, só fazer isso depois de criar a janela:
#include <iostream> sf::ContextSettings settings = janela.getSettings(); std::cout << "depth bits:" << settings.depthBits << std::endl; std::cout << "stencil bits:" << settings.stencilBits << std::endl; std::cout << "antialiasing level:" << settings.antialiasingLevel << std::endl; std::cout << "version:" << settings.majorVersion << "." << settings.minorVersion << std::endl;
Bom, com essa parte, já podemos criar a janela. A partir daqui, a coisa fica "interessante"...
Acho que já deu de artigos sobre OpenGL, certo?
Se quiserem, ainda tenho mais um artigo pré encaminhado.
[]'s
T+