Como posso mudar do modo imediato para os VBOs?

7

Estou usando o OpenGL há pouco tempo e gostaria de esclarecimentos sobre os VBOs . Pelo que entendi, um VBO é um objeto armazenado no VRAM. No modo imediato, para aplicar uma textura, basta vinculá-la e especificar as coordenadas da textura antes das coordenadas do vértice, no entanto, não parece assim com os VBOs.

Pergunta 1: Posso especificar dados de textura em um VBO? Qual parte dos dados?

Normalmente, quando eu faço um jogo em 2D, eu armazeno todos os meus objetos em instâncias de classes diferentes; quando minha rotina de desenho é exibida, basta desenhar os objetos que estão na tela. Com um ambiente 3D, seria um pouco mais difícil desenhar os objetos na tela, mas com um pouco de matemática, tenho certeza de que é possível.

Pergunta 2: Depois de descobrir quais objetos precisam ser renderizados, seria aceitável rapidamente enviar a esses objetos correspondentes uma solicitação de "aplicação" e aplicá-los eles mesmos? Ou há uma maneira melhor?

Pergunta 3: Se eu tenho um mapa completamente dinâmico, mas com objetos que não mudam com muita frequência, existem diretrizes sobre as diferenças de desempenho entre GL_STATIC_DRAWe GL_DYNAMIC_DRAW?

Pergunta final: Devo considerar usar listas de vértices? Ou os VBOs são apenas uma opção melhor?

ultifinito
fonte
Sobre o assunto da pergunta 2 ... Não sei se você quer dizer especificamente que os objetos de renderização de alto nível se desenham ou ainda está falando especificamente sobre máquinas VBO de nível inferior. Mas no caso do primeiro, você pode querer ver essa pergunta .
Gostaria de chamar glDrawElementscada objeto - ou devo guardar tudo como triângulos e ter apenas um glDrawElements? De qualquer maneira viável?
Ultifinitus 19/10/11

Respostas:

6

Resposta 1:

Claro que você pode, sem recursos de texturização, os buffers de vértices seriam quase inúteis. Um VBO é apenas uma porção de dados binários com o formato especificado (canal de posição, canal normal, canal de texcoord etc.) que é interpretado por um shader. Ao desenhar um objeto, você está dizendo à GPU para buscar esse lote de dados e aplicar as operações especificadas no shader (transformação de vértice, cálculo de luz, busca de textura etc.).

Então, por exemplo, você tem um VBO com um quad armazenado nele. O VBO armazena as informações de coordenadas de posição e textura dos quatro vértices. Agora, a única coisa que você precisa fazer é vincular o VBO, vincular um IBO para especificar os triângulos que compõem seu quadrilátero, dizer ao seu sombreador para usar uma textura de sua escolha e desenhar a coisa toda. E agora que você tem o VBO e o IBO ativos, você só precisa modificar o parâmetro de textura do shader e chamar novamente a função draw para reutilizar seu quad em um objeto diferente.

Resposta 2:

Conforme especificado na resposta 1, quando você tiver seu VBO criado e armazenado no VRAM, precisará atualizar suas variáveis ​​de sombreador e chamar glDrawElementsnovamente para redesenhar o objeto.

Resposta 3:

Bem, você pode aplicar GL_DYNAMIC_DRAWa todo o mapa, se é isso que você deseja. A diferença entre essas duas opções é que o driver escolhe armazenar buffers dinâmicos na parte mais rápida da VRAM que puder encontrar; portanto, se você o usar para objetos que não terão sua geometria alterada repetidamente, você estará gastando tempo. A referência do OpenGL para glBufferData fornece uma dica sobre qual é o melhor uso para seu buffer.

Resposta final:

glDrawArraysé apenas uma versão primitiva dos VBOs, onde os dados são divididos em canais, mas são re-carregados na GPU a cada chamada. Basta ficar com os VBOs se quiser o melhor desempenho.

r2d2rigo
fonte
1

Embora eu esteja completamente satisfeito com a resposta de r2d2rigo, gostaria de explicar como visualizarei sobre os VBOs: D

Primeiro, mesmo que VBO signifique Vertex Buffer Object, isso não significa que ele contém apenas coordenadas vextex.

    A Vertex will have attributes such as coordinates,texture 
    coordinates,normals,color.The whole thing makes a well defined vertex. 

Então, aqui você precisa entender um VBO como - "Ele pode armazenar todos os atributos de vértice". Basicamente, um VBO é um "buffer" que você pode vincular a qualquer informação do vértice.

Resposta 1: Sim (verifique a descrição acima)

Resposta 2: As VBOs geralmente são "mais rápidas" do que as listas de vértices comuns, pois não há necessidade de enviar as informações do vértice a cada quadro (se os dados forem estáticos). Mesmo que a arquitetura subjacente seja uma arquitetura de memória unificada, ela terá benefícios, pois não há "substituição" de dados desnecessariamente.

Resposta3: STATIC_DRAW / DYNAMIC_DRAW são apenas sinalizadores para informar à GPU subjacente onde manter os buffers. A GPU subjacente decidirá onde manter os buffers com base nos sinalizadores que você fornecer. Arquitetura de memória (onde a GPU compartilhará a RAM principal), acho que não fará nenhuma diferença significativa.

Ayyappa
fonte