Ainda existem vantagens em usar gl_quads?

10

OK, entendo que o gl_quads está obsoleto e, portanto, não devemos 'usá-lo'. Também entendo que um PC moderno ao executar um jogo usando gl_quads está desenhando dois triângulos.

Agora, eu ouvi por causa disso que um jogo deve ser escrito usando triângulos. Mas estou me perguntando se, devido às especificidades de como o OpenGL transforma esse quad em dois triângulos, é sempre vantajoso usar quads ainda?

Especificamente, atualmente estou processando muitos quads desconectados de objetos de buffer bastante grandes. Uma das áreas em que preciso tomar cuidado é o tamanho do vetor de flutuadores que estou usando para tornar / atualizar esses objetos de buffer (tenho alguns valores extras de flutuador por vértice e muitos vértices em um buffer - o os buffers maiores têm cerca de 500 KB).

Portanto, me parece que, se eu alterar meus objetos de buffer para desenhar triângulos, esses dados de vértices serão 50% maiores (seis vértices para desenhar um quadrado em vez de 4) e levará 50% mais tempo para a CPU gerar.

Se o gl_quads ainda funcionar, estou obtendo um benefício aqui ou os 50% de memória extra e tempo de CPU ainda estão sendo usados ​​na conversão automática do OpenGL em dois triângulos?

user27018
fonte
5
Tenho certeza que o OpenGL suporta algum tipo de buffer de vértice indexado, o que significa que você armazena apenas os mesmos 4 vértices para um quad e, em vez de repetir vértices inteiros para formar os dois triângulos, você repete apenas os índices: [0,1,2] , [2,3,0]
Ótima resposta aqui
bobobobo
Eu acredito que a especificação GL ainda estipula alguns casos em que o desenho como um quad é importante, por exemplo, com glPolygonMode (..., GL_LINE).
Maximus Minimus 5/03

Respostas:

5

Teste o seu jogo real. Se os quads são mais rápidos, use-os. Se não, não.

Pode-se argumentar que eles são mais lentos em alguns casos, porque alguns hardwares não suportam quads; portanto, o driver precisa fazer muito trabalho para "consertar" as chamadas quad draw. Alguns hardwares suportam quads, dividindo em triângulos em alguma etapa de montagem de entrada de função fixa, para que funcione sem sobrecarga significativa. Também há perguntas sobre como os quads são submetidos indexados e não indexados, conforme você levantou, e que faz melhor uso da largura de banda limitada de transferência de barramento e do tempo de geração da CPU. A sabedoria popular diz para evitar quads, o que é um bom conselho se você está começando do nada, talvez não tanto se o seu código já funciona. A sabedoria popular diz que muitas coisas matam o desempenho, apesar de jogos reais e de bom desempenho fazerem essas coisas.

Em resumo, teste. Não assuma e não peça conselhos de desempenho à Internet. Às vezes, podemos estar certos, mas com mais freqüência forneceremos dados desatualizados, dados com base em alguma circunstância específica em que você não esteja, ou lixo que adquirimos em segunda mão na Internet ou em colegas (que eles próprios podem não ter experiência em primeira mão).

Sean Middleditch
fonte
3

Quais são as alternativas? Bem, uma alternativa é usar Geometry Shaders , passando uma GL_LINES_ADJACENCYprimitiva (4 vértices) e fazendo com que o GS converta essa primitiva em uma faixa triangular. No entanto, será mais lento para renderizar, porque se deve assumir que os shaders de geometria são sempre mais lentos para renderizar.

Um método melhor é usar a renderização indexada. Aqui, você tem duas alternativas: GL_TRIANGLESe GL_TRIANGLE_STRIPcom a reinicialização primitiva. O último resultará em um buffer de índice um pouco menor (um índice para cada quadrante). Você pode reutilizar o mesmo buffer de índice para qualquer renderização quad, para não precisar atualizar ou modificar o buffer de índice.

Eu também sugeriria usar shorts não assinados como o tipo de índice. Se você precisar renderizar mais de 16384 quads de uma vez, faça várias chamadas de renderização, usando glDrawElementsBaseVertex para compensar os índices.

Nicol Bolas
fonte
Alguns testes de desempenho recentes que eu fiz mostram que o glMultiDrawArrays agora é um caminho rápido para NV e AMD (não se incomodou com a Intel), então há outra opção - glMultiDrawArrays com ventilador ou faixa.
Maximus Minimus
@ mh01: Isso requer uma matriz do lado do cliente de comandos de desenho. Você precisaria glMultiDrawArraysIndirectfazer isso no lado da GPU. O que você pode fazer, mas limita o hardware.
Nicol Bolas