Pergunta

Isso é algo que eu tenho procurado enquanto, mas ainda não encontrei nenhuma informação concreta ou bons exemplos. Eu, digamos, um monte de objetos desconectados (tiras de triângulo, por exemplo). Qual é a maneira eficiente de renderizar isso?

Ouvi falar sobre colocar vários objetos em um VBO para reduzir as chamadas do OpenGL, mas não vi um exemplo adequado de como fazer isso. Eu também vi posts que contradizem essa ideia. Então, agora, estou apenas confuso.

Foi útil?

Solução

Primeiro, você provavelmente deve usar o VBO o tempo todo. Para objetos pequenos e grandes.

Então, a segunda edição é "Como combinar vários objetos separados em um objeto grande?" - Portanto, para reduzir o número de chamadas OpenGL que precisam ser feitas. Geralmente, objetos que usam a mesma textura (s), configurações de material e shaders podem ser combinados. Por exemplo, se você tiver toneladas de caixas idênticas por aí, pode fazer sentido combiná -las em várias "estacas de caixas" maiores.

Se um objeto for uma lista de triângulo, a combinação é fácil - basta criar uma grande lista de triângulo nas listas de origem. Se um objeto for uma tira do triângulo, você deve usar "triângulos degenerados" para se juntar às tiras (essa é uma otimização muito útil para um único objeto, se não puder ser representado como uma única tira).

Um "triângulo degenerado" é um triângulo que possui dois ou três índices idênticos de vértice. O hardware gráfico pode reconhecê -los e pular muito rápido.

Então, se você tiver, por exemplo, duas tiras com um triângulo cada, para um total de seis vértices.

Os índices originais do triângulo das tiras seriam:

1) 0, 1, 2
2) 0, 1, 2

Agora você se junta a todos os vértices, então acaba com 6 vértices.

1) 0, 1, 2 (unchanged)
2) 3, 4, 5

Até agora você tem uma matriz de vértices, mas ainda duas tiras separadas. Tem que se juntar a eles inserindo triângulos degenerados:

1) 0, 1, 2, 2, 2, 3, 4, 5

(Acho que o exposto acima está correto, mas na verdade não verificou)

A idéia é a seguinte: com a faixa acima, a placa gráfica desencadearia triângulos desses vértices:

0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5

Em caso geral, você precisa inserir dois ou três triângulos degenerados com base no comprimento da tira original, para que o enrolamento do triângulo permaneça correto.

Outras dicas

Investigar GLDRAWELEMENTS (), é uma boa maneira de alcançar o que você quer. Observe que o desempenho pode cair se seus dados alterarem cada quadro, pois você precisar atualizar as partes relevantes dos dados, o que significa copiá -los para a memória da placa gráfica. Para dados estáticos, isso é muito rápido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top