Vejo que o OpenGL versões 3 e posteriores eliminam o uso da renderização do lado do cliente. O modo imediato foi eliminado e as matrizes de vértices parecem obsoletas. Em vez disso, se bem entendi, os VBOs são a principal maneira de renderizar vértices.
Embora eu veja a lógica por trás de ter uma maneira uniforme de renderizar tudo, será que os VBOs não têm grandes desvantagens em relação às matrizes de vértices? Eu pensei que os VBOs deveriam ser grandes buffers contendo> 1 MB de dados, geralmente. E se eu tiver uma cena com uma geometria menor? Eu tenho um gráfico de cena com um grande número de nós, cada um dos quais precisa de sua própria transformação etc. Cada nó também deve poder ser excluído separadamente, adicionado a separadamente etc. Eu estava usando matrizes de vértices antes. Portanto, minha primeira pergunta é se, se eu mudar para VBOs, haverá uma sobrecarga maior nos meus objetos de gráfico de cena agora porque um VBO precisa ser alocado para cada objeto.
Outra preocupação é que a geometria que estou renderizando pode ser altamente dinâmica. Na pior das hipóteses, pode haver momentos em que toda a geometria precise ser reenviada a cada quadro por algum período de tempo. As VBOs terão desempenho pior do que as matrizes de vértices nesse caso de uso ou as VBOs, na pior das hipóteses, funcionam tanto quanto as matrizes de vértices, mas não mais?
Então, em um formato mais conciso, minhas perguntas são:
1) Existe uma sobrecarga substancial na alocação / desalocação de VBOs (quero dizer o mero ato de configurar um buffer)?
2) Se estou atualizando os dados da CPU a cada quadro, isso pode ser substancialmente pior do que se eu tivesse usado matrizes de vértices?
E, finalmente, eu gostaria de saber:
3) Se a resposta para qualquer uma das perguntas acima for "sim", por que reprovar outros modos de renderização que podem ter vantagens sobre os VBOs? Há algo que estou faltando aqui, como técnicas que devo usar para mitigar alguns desses custos de alocação em potencial etc.?
4) As respostas para qualquer uma dessas perguntas mudam substancialmente dependendo da versão do OpenGL que estou usando? Se eu refatorar meu código para que seja compatível com o OpenGL 3 ou 4 usando VBOs de uma maneira que seja de bom desempenho, as mesmas técnicas provavelmente terão um bom desempenho com o OpenGL 2 ou será provável que certas técnicas sejam muito mais rápidas com o OpenGL 3 + e outros com OpenGL 2?
Fiz essa pergunta no estouro de pilha, mas estou postando novamente aqui porque percebi que este site pode ser mais apropriado para minha pergunta.
fonte
Respostas:
Defina "substancial". É geralmente prudente não criá-los no meio dos quadros; eles devem ser configurados durante a inicialização ou em qualquer outro lugar. Mas isso é verdade para a maioria dos objetos OpenGL, como texturas, buffers de renderização ou shaders.
Pode? Sim. O OpenGL define funcionalidade, não desempenho . Você pode realmente tornar as coisas muito mais lentas. Ou você pode tornar as coisas mais rápidas. Tudo depende de como você o usa.
O OpenGL Wiki tem um bom artigo sobre como transmitir dados corretamente .
Primeiro, eles não foram apenas preteridos. Reprovação significa marcar algo como "a ser removido" em versões futuras. Eles foram descontinuados no 3.0 e removidos no núcleo 3.1 e acima.
Segundo, o ARB geralmente explicou o motivo pelo qual removeu coisas do OpenGL. Isso torna as especificações menores e mais simples. Isso torna a API menor e mais simplificada. Torna mais fácil saber quais APIs você deve usar; 2.1 tinha 4 maneiras de fornecer dados de vértice; 3.1+ tem 1. Ele se livra de muita sujeira. Etc.
Mais ou menos não. Somente no MacOSX a diferença entre as versões 3.1 + core e pré-3.0 é realmente aparente. O perfil de compatibilidade é implementado por todos os drivers para Linux e Windows, portanto, você pode assumir que o perfil principal desses drivers está apenas adicionando verificações para impedir que você chame as funções de compatibilidade.
No Mac OSX 10.7, o núcleo GL 3.2 está disponível, mas não o perfil de compatibilidade. Isso não significa necessariamente nada para as técnicas de desempenho, uma contra a outra. Mas isso significa que, se houver diferenças, é nessa plataforma que você as verá.
fonte
Da maneira que o OpenGL funciona, sempre que você usa dados que não sejam da VBO, o driver precisa fazer uma cópia - na prática, criando uma VBO temporária - já que nada impede você de modificar suas matrizes nuas no espaço do usuário entre as chamadas para o OpenGL.
Pode haver alguns truques do lado do motorista para acelerar a alocação temporária, mas não há nada que você possa fazer para evitar a cópia.
Então sim, contanto que você - e os desenvolvedores do driver - façam tudo certo, os VBOs devem (tm) sempre apenas acelerar as coisas.
fonte
glDrawRangeElements
para desenhar cada objeto individual, ou isso é ineficiente como as matrizes de vértices?glDrawRangeElements
várias vezes em cada VBO com alguns VBOs, em vez de dar a cada objeto seu próprio VBO?Não é bem assim. Matrizes de vértice são a base para objetos de buffer de vértice. Somente o armazenamento mudou do cliente para o servidor.
Mesclar conjuntos de geometria menores em VBOs maiores. Não é necessário ter um VBO por lote de geometria. Você pode endereçar perfeitamente subconjuntos de um VBO para renderização. Use um deslocamento diferente de zero para o parâmetro gl… Pointer data.
Para isso, existem os sinalizadores de uso do buffer GL_DYNAMIC_DRAW e GL_STREAM_DRAW.
Porque não há vantagens. Os dados da geometria devem ser transferidos para a GPU em qualquer caso. O uso de uma matriz regular de vértices do lado do cliente ainda causará uma transferência de DMA para a GPU, e o modo imediato criará um lote para transferir primeiro também.
Não há absolutamente nenhum benefício em não usar VBOs.
fonte