11.07.2015 Views

OpenGL Avançado

OpenGL Avançado

OpenGL Avançado

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

A fim de descobrir o melhor local para armazenar os dados dos VBOs criados a implementação do<strong>OpenGL</strong> (driver de vídeo) utilizará o parâmetro usage da função glBufferData() como “dica” e, porisso, ele é muito importante na busca por maior desempenho.Observe atentamente o Código 2 e faça a correlação dos parâmetros de função e a estrutura dedados utilizados.// Criação do VBO de dados de vérticesglGenBuffers(1, &id_vbuffer);glBindBuffer(GL_ARRAY_BUFFER, id_vbuffer);glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * NUM_VERTS, vertexdata,GL_STATIC_DRAW); // transferência do dados de vértices// Criação do VBO de dados de índicesglGenBuffers(1, &id_ibuffer);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id_ibuffer);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * NUM_INDICES, indexdata,GL_STATIC_DRAW); // transferência do dados de índicesCódigo 2. Exemplo VBO. Etapa de transferência de dados para GPU.Criados os VBOs e transferidos os dados, resta a etapa de renderização, a qual requer 3 passos(semelhante ao utilizado em Vertex Array):1. Vinculação do buffer a ser utilizado pelo <strong>OpenGL</strong> com glBindBuffer().2. Ativação e definição dos atributos dos vérticesvoid glEnableVertexAttribArray(GLuint index);void glVertexAttribPointer(GLuint index, GLint size, GLenum type,GLboolean normalized, GLsizei stride, const GLvoid * pointer);Parâmetros: index: índice do atributo do vértice (correspondente ao vertex shader) size: especifica o número de componentes do atributo, podendo ser 1, 2, 3 ou 4 type: especifica o tipo de dado de cada componente do array stride: especifica o offset (intercalação) entre atributos consecutivos pointer: especifica o ponto de início (definido como um offset, e não como umponteiro) para o primeiro atributo do tipo definido no array3. Chamada da função de desenho com glDrawElements() ou outra.Um atributo do vértice (posição, índice, normal, coordenada de textura, etc.) é habilitado e definidocom as funções glEnableVertexAttribArray() e glVertexAttribPointer(), respectivamente. Atravésda função glVertexAttribPointer() a formatação dos dados é enviada ao <strong>OpenGL</strong>. Note que noCódigo 3 existem três chamadas a essa função, cada uma definindo a estrutura de dados utilizadaneste exemplo. Observe estas funções e compare-as com a Figura 1.// Bind dos VBOs a serem utilizadosglBindBuffer(GL_ARRAY_BUFFER, id_vbuffer);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id_ibuffer);// Ativação e definição dos atributos dos vérticesglEnableVertexAttribArray(0); // texcoord_uvglVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 8,(void*)(sizeof(GLfloat) * 6));glEnableVertexAttribArray(1); // normal_xyz9

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!