Classificando objetos antes da renderização

10

Estou tentando implementar um gráfico de cena e, em todos os artigos que encontrei, há discussões sobre classificação de objetos. Então, você classifica seus objetos por "material", por exemplo. Agora, até que me sentei e comecei a implementá-lo, eu meio que tomei isso como garantido, porque fazia sentido. Mas agora estou me perguntando o que realmente muda a classificação?

No meu mecanismo, tenho um gerente de UBOs, uso-os para armazenar dados que serão compartilhados entre programas, no momento que envolve apenas tempo, matrizes de câmera e projeção e luzes (não me preocupo em gerenciar quais luzes afetam quais objetos ATM).

Agora, para cada modelo, eu tenho que mudar o modelo para uniforme da matriz mundial, nenhuma classificação vai mudar isso. Então é o salto de mudar essa matriz para também definir um material para cada objeto tão ruim?

Lembro- me vagamente de ler em algum lugar que cada vez que você altera algo no pipeline, ele precisa ser liberado e isso pode causar problemas de desempenho. Mas, para cada chamada de desenho, estou configurando um modelo para a matriz mundial, então que sentido faz para se preocupar com isso?

Aliás, existe alguma informação sobre se alterar um uniforme e chamar glBufferSubData é mais (ou menos) caro.

dreta
fonte
3
Resposta rápida, sim, o salto de mudar uma matriz para também definir materiais em cada objeto é tão ruim assim. Nesse momento, sugiro fazer uma viagem lateral para descobrir as ferramentas de medição de desempenho OpenGL para sua plataforma antes de continuar. Com as ferramentas perf, você pode facilmente medir diferentes técnicas e descobrir o que funciona melhor para as necessidades do seu renderizador. Além disso, essas ferramentas irá durar toda a sua carreira para a frente enquanto este renderizador ... não tanto ;-)
Patrick Hughes
@PatrickHughes impressionante, obrigado, eu vou verificar definitivamente aqueles fora
dreta

Respostas:

4

Você definitivamente deseja classificar para agrupar materiais. Se você puder, também pode usar instanciamento para agrupar geometria (por exemplo, se você tiver um número X dos mesmos objetos).

Também há valor na classificação por profundidade também. Você deve classificar de volta para a frente em busca de objetos transparentes (ignorando várias técnicas avançadas que removem essa necessidade, em circunstâncias limitadas).

Também vale a pena classificar objetos opacos da frente para trás, pois isso permite que o Z inicial reduz bastante a sobrecarga do shader de fragmentos da cena.

Sean Middleditch
fonte
3
Encomendar objetos opacos / transparentes não é fácil para situações complexas (a ponto de serem impossíveis sem regras arbitrárias). Você também pode agrupar por textura com o mesmo objetivo de reduzir chamadas de gl.
Darkwings
A ordenação por textura é necessária para fazer chamadas em lote e reduzir as chamadas de sorteio. A classificação não tem nada a ver com a redução de chamadas de empate. A classificação tem a ver com a obtenção da renderização correta (para objetos transparentes) ou para minimizar a sobrecarga do processador de fragmentos (para objetos opacos). Ser "complexo" é um problema, sim, mas é com isso que os programadores gráficos dos mecanismos de jogo são pagos para lidar para tornar os jogos realmente jogáveis ​​em hardware comum. A eficiência do hardware entre objetos opacos classificados e não classificados por si só pode ser bastante massiva.
Sean Middleditch 27/05
opengl.org/wiki/Transparency_Sorting Isso é o que eu quis dizer com 'regras arbitrárias'. Não existe uma classificação 'correta' objetiva para casos complexos. Sobre 'ordenar' e 'ordenar', o OP claramente declarou 'ordenar por material' (independentemente da transparência), e eu quis dizer o mesmo para textura, pois os dois almejam o impacto no desempenho.
Darkwings
Para ser sincero, nunca vi esse tipo de problema em jogos reais. Esses exemplos não refletem realmente como alguém realmente faz as coisas, onde objetos transparentes geralmente têm um tamanho aproximadamente niforme e têm limites de colisão razoavelmente "quadrados", os quais impedem sobreposições malucas. Em ambos os casos, o fato de que "é difícil" não muda sua necessidade. É claro que também indiquei que o lote por material é importante, e mencionei a tentativa de contrariar a afirmação "nenhuma classificação pode ajudar"; portanto, não tenho certeza se há algo concreto que você encontrou errado na minha resposta.
Sean Middleditch 28/05
Olha, um comentário não significa que encontrei algo errado na sua resposta e nunca disse 'nenhuma classificação pode ajudar'. Afirmei que existem casos em que não existe uma solução correta objetiva, portanto, obviamente, uma solução deve ser encontrada usando regras arbitrárias. Essas são duas afirmações completamente diferentes.
quer
3

A classificação de objetos puramente por profundidade tem um enorme valor, especialmente em arquiteturas de renderização em bin ou em ladrilhos.

Classifique os sólidos da frente para trás, as transparências de trás para a frente.

Ao renderizar, o material mais próximo da câmera e do sólido é renderizado primeiro, e qualquer outra coisa que ocupe o mesmo espaço será rejeitada por uma verificação inicial do buffer z.

Se a arquitetura gráfica tiver algum tipo de buffer z hierárquico ou de baixa resolução, a geometria poderá ser descartada antes mesmo que algo seja renderizado.

Jari Komppa
fonte