Estou apenas começando com o OpenGL e estou tentando usá-lo para criar um jogo em 2D. Neste jogo, eu tenho uma grade hexagonal composta por uma variedade muito grande de hexágonos de cores diferentes. Como programador iniciante em OpenGL, vejo duas maneiras de desenhar essa grade:
- Usando um buffer de vértice com os dados para um único hexágono, depois usando um valor de deslocamento uniforme e iterando na CPU para desenhar o mesmo programa várias vezes até que eu tenha uma grade.
- Criando um buffer de vértice pré-calculado muito grande e singular que desenha todos os hexágonos em uma única chamada.
Qual é o método mais eficiente? Existe um jeito melhor de fazer isso?
Respostas:
De fato, existem algumas maneiras de fazer essa grade.
A maneira mais eficiente seria instanciar. Dessa forma, você cria seu hexágono apenas uma vez em um VBO e o processa cem, mil ou um milhão de vezes. Você pode fazer isso manualmente usando sombreadores com uniformes, como você disse no ponto 1, mas também há uma funcionalidade OpenGL incorporada. Para isso, dê uma olhada no glDrawElementsInstanced .
Observe que instanciar é apenas mais rápido que outros métodos se você desenhar mais do que uma certa quantidade de objetos instanciados. Por exemplo, o desenho 300 pode ser mais rápido usando 1 VBO grande, mas o desenho de 2 milhões pode ser mais rápido se você usar a renderização instanciada.
Se você usar a renderização instanciada, poderá enviar dados por objeto usando os Divisores de Atributo . No seu caso, você deseja enviar a posição e a cor.
Um bom tutorial sobre renderização instanciada: clique
Realmente, a melhor maneira é tentar os dois métodos e verificar a quantidade de milissegundos necessária para desenhar 1 quadro. Dessa forma, você também aprende nos dois sentidos, o que é sempre bom.
Observe também que a renderização instanciada é uma funcionalidade moderna do OpenGL e você precisará usar shaders para usá-la. Mas é sempre melhor aprender da maneira correta desde o início.
fonte
O método 1 é mais simples de codificar e ficará bem desde que você não tenha muitos hexágonos à vista de uma só vez. Você pode ficar com isso, já que é novo no OpenGL, para evitar colocar muita complexidade em seu prato ao mesmo tempo.
Se houver um grande número de hexágonos (como várias centenas ou mais de mil) em exibição ao mesmo tempo, seria necessário um método de menor sobrecarga para evitar que a sobrecarga da CPU fizesse tantos empates individuais. O método 2 funcionaria para isso, ou melhor ainda, para instanciar. Eu esperaria que o instanciamento fosse mais rápido que o método 2, ou certamente pior, já que você só precisa atualizar um buffer de dados por instância em vez de um buffer (muito maior) de dados de vértice para todas as instâncias.
fonte