Introdução à Opengl com Java
Introdução à Opengl com Java
SCC0250 - Computação Gráfica
Prof. Fernando V. Paulovichhttp://www.icmc.usp.br/~paulovic
Instituto de Ciências Matemáticas e de Computação (ICMC)Universidade de São Paulo (USP)
3 de março de 2014
1 / 29
Introdução à Opengl com Java
Sumário
1 OpenGL
2 Instalação
2 / 29
Introdução à Opengl com JavaOpenGL
Sumário
1 OpenGL
2 Instalação
3 / 29
Introdução à Opengl com JavaOpenGL
Introdução
Application Programming Interface (API)
Coleção de rotinas que o programador pode chamarModelo de como estas rotinas operam em conjunto para gerargráficosProgramador “enxerga” apenas a interfaceNão precisa lidar com aspectos específicos do hardware ouidiossincracias de software no sistema gráfico residente(independente do dispositivo)Oferece suporte para gerar e exibir cenas 3D complexas, etambém para gráficos 2D simples
4 / 29
Introdução à Opengl com JavaOpenGL
OpenGL
Ambiente p/ escrever e executar programas gráficosMonitor (“tela”) + biblioteca de software – para desenharprimitivas gráficas na tela
API pode ser vista como uma “caixa preta”Entradas: Chamadas a funções da biblioteca feitas peloprograma do usuário; Medidas fornecidas por dispositivos deentrada; etcSaídas: Os gráficos exibidos no monitorDescrita em termos das funções que disponibiliza
5 / 29
Introdução à Opengl com JavaOpenGL
API OpenGL
Programa
Em geral, trabalha com um sistema de janelas (“windowsystem”)Inicializações: modo de exibição (“display mode”), janela dedesenho e sistema de coordenadas de referência (associado àjanela)
API oferece centenas de funções...Diferentes funcionalidades
Funções primitivas: o queFunções de atributos: como...
6 / 29
Introdução à Opengl com JavaOpenGL
Programação Dirigida a Eventos
Direcionada a eventos (event-driven)programa responde a eventos: clique do mouse, teclapressionada, redimensionamento da janela
7 / 29
Introdução à Opengl com JavaOpenGL
OpenGL 3.x
A partir da OpenGL 3Sem suporte para operações sobre matrizes
glRotate, glTranslateVBO & VAO são essenciais
Vertex Buffer Object: Buffer para transferir atributos dosvértices, como coordenadas e cores, da aplicação para a placagráfica.Vertex Array Object: Estrutura que comporta vários VBOs epermite que mais que um atributo seja transferido de uma vez.
Orientado a shaders
8 / 29
Introdução à Opengl com JavaOpenGL
Estados do OpenGL
OpenGL rastreia diversas variáveis de estadoTamanho atual de um ponto, cor de fundo da janela, cor dodesenho, etc.O valor corrente permanece ativo até que seja alterado
Tamanho de ponto: glPointSize(3.0)Cor de fundo: glClearColor(red, green, blue, alpha)Limpar janela: glClear(GL_COLOR_BUFFER_BIT) – os bitsdo “color buffer” serão modificados para a cor de fundo
9 / 29
Introdução à Opengl com JavaOpenGL
Programando
Um programa OpenGL é definido por meio de implementaçãode uma interface ouvinte (GLEventListener) que controla odesenho em um canvas (GLCanvas)
Adicionar esse canvas a um JFrame e ativar um ”Animator” é oúltimo passo para se criar uma aplicação OpenGL
O ”Animator” define o loop de desenho
10 / 29
Introdução à Opengl com JavaOpenGL
Programando
GLEventListener é responsável pelo desenho e outras funções
1 public class Example01 implements GLEventListener {23 public void init(GLAutoDrawable drawable) {4 // inicializar o sistema5 }67 public void display(GLAutoDrawable drawable) {8 // função de desenho9 }
1011 public void reshape(GLAutoDrawable drawable, int x, int y,12 int width, int height) {13 // função de redimensionamento14 }1516 public void dispose(GLAutoDrawable drawable) {17 // função para liberar recursos18 }19 }
11 / 29
Introdução à Opengl com JavaOpenGL
Programando
Montando uma aplicação
1 public static void main(String[] args) {2 // Define um profile para trabalhar com a OpenGL 3.03 GLProfile profile = GLProfile.get(GLProfile.GL3);45 // Configuracoes6 GLCapabilities glcaps = new GLCapabilities(profile);7 glcaps.setDoubleBuffered(true);8 glcaps.setHardwareAccelerated(true);9
10 // Cria o canvas (elemento de desenho)11 GLCanvas glCanvas = new GLCanvas(glcaps);1213 // Adiciona o ouvinte de desenho ao canvas14 glCanvas.addGLEventListener(new Example01());1516 ...
12 / 29
Introdução à Opengl com JavaOpenGL
Programando (continuação)
1 ...2 // Cria um JFrame e adiciona o canvas3 JFrame frame = new JFrame("Example 01");4 frame.setSize(800, 600);5 frame.getContentPane().add(glCanvas);67 // Cria um "animator" para ativar o loop de desenho8 final AnimatorBase animator = new FPSAnimator(glCanvas, 60);9
10 // Muda o gerenciador de evento de fechamento do JFrame11 frame.addWindowListener(new WindowAdapter() {12 public void windowClosing(WindowEvent e) {13 new Thread(new Runnable() {14 public void run() {15 animator.stop();16 System.exit(0);17 }18 }).start();19 }20 });2122 // Torna o frame visivel e inica o loop de animacao23 frame.setVisible(true);24 animator.start();25 }
13 / 29
Introdução à Opengl com JavaOpenGL
Programando
Para a definição de como o pipeline da OpenGL irá funcionarshaders precisam ser escritos em OpenGL ShadingLanguage (GLSL)
GLSL é uma linguagem de alto nível que permite aosdesenvolvedores controlar o pipeline gráfico sem precisar sepreocupar com aspectos específicos de hardware
Similar a linguagem C, suportando laços, comandos de decisão,etc.
14 / 29
Introdução à Opengl com JavaOpenGL
OpenGL Shading Language
Cada placa gráfica inclui um compilador GLSL em seu driver –código pode ser otimizado para utilizar as particularidades daplaca
Existem diferentes shaders na OpenGL: vertex, fragment,geometry, etc., cada um com uma função específica dentro dopipeline
Para poderem ser usados, os shaders devem ser carregados,compilados e ”linkados” ao programa sendo executado
15 / 29
Introdução à Opengl com JavaOpenGL
Programando (Controlador dos Shaders)
Controla um determinado shader
1 public class Shader {2 //Define os arquivos dos shaders3 public Shader(String vertex, String fragment) {...}45 //Le os shaders, compila e "linka"6 public void init(final GL3 gl) {...}78 //Ativa os shaders9 public void bind() {...}
1011 //Desativa os shaders12 public void dispose() {...}1314 //Define um "pointeiro" para passar constantes para os shaders15 public int getUniformLocation(String varName) {...}1617 //Define um "pointeiro" para passar atributos para os shaders18 public int getAttribLocation(String varName) {...}19 }
16 / 29
Introdução à Opengl com JavaOpenGL
Programando (Controlador dos Shaders)
Cria objetos de shader
1 public class ShaderFactory {23 public enum ShaderType {45 SIMPLE_SHADER6 };78 public static Shader getInstance(ShaderType type) {9 if (type == ShaderType.SIMPLE_SHADER) {
10 return new Shader("simple_vertex.glsl", "simple_fragment.glsl");11 }12 return null;13 }14 }
17 / 29
Introdução à Opengl com JavaOpenGL
Programando
Utilizando os shaders dentro da nossa aplicação
1 public class Example01 implements GLEventListener {23 private Shader shader; // Gerenciador os shaders4 private int[] vbo; // Vertex Buffer Object5 private int nr_vertices; // Numero de vertices no VBO67 public Aula01() {8 // Carrega os shaders9 shader = ShaderFactory.getInstance(ShaderFactory.ShaderType.←↩
SIMPLE_SHADER);10 }1112 ...13 }
18 / 29
Introdução à Opengl com JavaOpenGL
Programando
Define o método de inicialização
1 @Override2 public void init(GLAutoDrawable drawable) {3 // Recupera o pipeline4 GL3 gl = glad.getGL().getGL3();56 // define "cor do fundo"7 gl.glClearColor(0, 0, 0, 0);89 //inicializa os shaders
10 shader.init(gl);1112 //ativa os shaders13 shader.bind();1415 //cria o objeto a ser desenhado16 nr_vertices = create_object(gl);17 }
19 / 29
Introdução à Opengl com JavaOpenGL
Programando
Método para criação de um objeto (VBO)
1 private int create_object(GL3 gl) {2 float[] TRIANGLE_VERTICES = new float[]{ -0.5f, -0.5f, 0.0f,3 0.5f, -0.5f, 0.0f,4 0.0f, 0.5f, 0.0f,};56 // Cria um buffer contendo a posição dos vertices7 vbo = new int[1];8 gl.glGenBuffers(1, vbo, 0);9 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);
10 gl.glBufferData(GL3.GL_ARRAY_BUFFER, TRIANGLE_VERTICES.length * ←↩Buffers.SIZEOF_FLOAT,
11 Buffers.newDirectFloatBuffer(TRIANGLE_VERTICES), GL3.←↩GL_STATIC_DRAW);
12 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0);1314 // Passa o buffer para o vertex shader15 int vertexPositions = shader.getAttribLocation("a_position");16 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, vbo[0]);17 gl.glVertexAttribPointer(vertexPositions, 3, GL3.GL_FLOAT, false, 0,←↩
0);18 gl.glEnableVertexAttribArray(vertexPositions);1920 return TRIANGLE_VERTICES.length / 3;21 }
20 / 29
Introdução à Opengl com JavaOpenGL
Programando
Vertex shader
1 #version 15023 in vec3 a_position;45 void main(void)6 {7 gl_Position = vec4(a_position, 1.0);8 }
21 / 29
Introdução à Opengl com JavaOpenGL
Programando
Fragment shader
1 #version 15023 out vec4 fragColor;45 void main(void)6 {7 fragColor = vec4(1.0, 0.0, 0.0, 1.0);8 }
22 / 29
Introdução à Opengl com JavaOpenGL
Programando
Define o método de desenho
1 public void display(GLAutoDrawable drawable) {2 // Recupera o pipeline3 GL3 gl = glad.getGL().getGL3();45 // Limpa o frame buffer com a cor definida6 gl.glClear(GL3.GL_COLOR_BUFFER_BIT);78 // Desenha o buffer carregado em memória (triangulos)9 gl.glDrawArrays(GL3.GL_TRIANGLES, 0, nr_vertices);
1011 // Força execução das operações declaradas12 gl.glFlush();13 }
23 / 29
Introdução à Opengl com JavaOpenGL
Programando
Libera recursos alocados
1 public void dispose(GLAutoDrawable glad) {2 // Recupera o pipeline3 GL3 gl = glad.getGL().getGL3();45 // Apaga o buffer6 gl.glBindBuffer(GL3.GL_ARRAY_BUFFER, 0);7 if (vbo[0] > 0) {8 gl.glDeleteBuffers(1, vbo, 0);9 vbo[0] = 0;
10 }11 }
24 / 29
Introdução à Opengl com JavaOpenGL
Primitivas
Primitivas básicasPontos, linhas, poli-linhas, polígonos (GL_POINTS,GL_LINES, GL_POLYGON, GL_TRIANGLES, etc.)
Para descrever um objeto, uma lista de vértices é informada
1 private static final float[] TRIANGLE_VERTICES = new float[] {2 -0.5f, -0.5f, 0.0f,3 0.5f, -0.5f, 0.0f,4 0.0f, 0.5f, 0.0f,5 };
25 / 29
Introdução à Opengl com JavaOpenGL
Outras Primitivas: Poli-linhas e Polígonos
Poli-linha: GL_LINE_STRIP, GL_LINE_LOOPseqüência de linhas conectadas... fechada ou não
Outras primitivasGL_QUADSGL_TRIANGLE_STRIPGL_TRIANGLE_FANGL_QUAD_STRIP
26 / 29
Introdução à Opengl com JavaOpenGL
Outras Primitivas: Poli-linhas e Polígonos
27 / 29
Introdução à Opengl com JavaInstalação
Sumário
1 OpenGL
2 Instalação
28 / 29
Introdução à Opengl com JavaInstalação
Instalação
Git:Instale o Git:http://git-scm.com/book/en/Getting-Started-Installing-GitClone o repositório:git clone https://bitbucket.org/fatore/cg-2014
Maven:Instale o Maven:
Netbeans: nada a fazerEclipse: https://www.eclipse.org/m2e/download/Linha de comando: http://maven.apache.org/download.cgi
Instale as dependências:mvn install (dentro da pasta clonada)
29 / 29