Devo agrupar primitivas de depuração para renderização no OpenGL moderno?

7

Recentemente, comecei a portar algumas demos de renderização antigas que fiz para o OpenGL moderno. Eu tinha uma classe de desenho de depuração no meu código antigo que usava o modo imediato glBegin (), glEnd () etc. para renderizar objetos de depuração, como triângulos, cubos e esferas, etc.

Originalmente, substituí o código nessas funções pelo código para gerar os VAO e VBOs (para posição e cor), vinculá-los, atribuir os dados do vértice, renderizar e desativar e excluir os VBOs e VAO. Há algo de errado nisso?

Eu estive pensando em modificar a classe para que, toda vez que receba uma chamada primitiva, gere o VAO e os VBOs e atribua os dados do vértice, mas na verdade não faça a renderização até que todas as outras renderizações tenham sido concluídas. Em seguida, renderiza todos os prims de depuração que foram armazenados de uma só vez.

Não tenho certeza dos benefícios de qualquer maneira de fazer isso e estava me perguntando o que as pessoas pensavam.

user10329
fonte

Respostas:

7

Se você estiver fazendo o desenho de depuração, o desempenho realmente não deve ser sua maior preocupação. Fazê-lo funcionar é muito mais importante. Afinal, você não usará essas coisas nas versões de lançamento, então o que isso importa?

No entanto, se você estiver interessado em uma maneira de fazer isso, esta página sobre fluxo de objetos em buffer sugere maneiras de melhorar o desempenho dos dados de vértice gerados manualmente. Preste atenção especial ao método "Buffer Update".

Nicol Bolas
fonte
1

Se você deseja usar o modo imediato ou VBOs, isso depende da complexidade da cena. Eu já vi alguns exemplos em que linhas tangentes / normais são desenhadas usando o modo imediato.

Não há nada errado em usar VBOs para depuração. No entanto, lembre-se de que, em geral, o lote oferece benefícios de desempenho, independentemente da abordagem usada, portanto, sempre use-o sempre que possível. Você ainda pode se beneficiar muito do lote no modo imediato (talvez até mais), porque isso reduzirá bastante o número de alterações de estado. Se estiver em lote corretamente, você precisará apenas de um GlBegin () e GlEnd (), e todos os dados semelhantes serão agrupados. A única diferença é que você estará agrupando chamadas de estado em vez de dados de vértice.

ChrisC
fonte
3
Eu não estou querendo usar o modo imediato, pois foi preterido. No momento em que substituí o modo imediato, para que, em uma chamada para dizer DrawDebugCube (), ele crie os buffers de vértices, os preencha com dados, os renderize e os exclua. O que estou pensando em fazer é ter DrawDebugCube () apenas criar os buffers e preenchê-los. Todos os prims de depuração que foram armazenados em buffer são renderizados todos de uma vez mais tarde.
precisa saber é o seguinte