Qual é o estado da arte no particionamento espacial para jogos? [fechadas]
18
Eu sei sobre árvores BSP, Octrees e Portal que foram usadas por um longo tempo. Mas os jogos modernos ainda usam esses sistemas ou estão usando coisas novas?
Se for possível com prós e contras, considere a detecção de renderização e colisão.
Não garante uma resposta completa, mas o hash espacial parece ser uma idéia nova; ou caiu em favor. Não é para tudo, mas a grande vantagem é que é muito fácil de implementar.
23612 Jonathan Dickinson
Respostas:
15
Sim, o mecanismo Unreal 3, por exemplo, ainda usa um BSP - principalmente porque é usado durante o processo CSG. O Doom3 / id tech 4 usa portais e acho que li algo que o id Tech 5 está de volta às árvores do BSP. Existem alguns jogos que usam octrees também. No jogo, meu entendimento é que o UE3 mudou para uma abordagem mais dinâmica com consultas de oclusão, mas eu ficaria surpreso se eles não usassem o BSP para pelo menos determinar quais malhas estáticas estão à vista. Outros jogos podem apenas usar o view-frustum culling (Civilization, por exemplo). Realmente depende do tipo de jogo que você procura.
A razão pela qual BSPs e outras coisas ainda estão por aí é porque você não pode fazer muito melhor. Se você tem geometria estática, um BSP é ótimo se você o construir corretamente. No entanto, é necessário escrever um construtor BSP, o que é complicado (mas pode acontecer de graça se a sua solução CSG usa um!) Octrees e soluções mais dinâmicas (como contar com consultas de oclusão para tudo) são mais simples de implementar, têm maior tempo de execução custo, mas não requer pré-processamento (caro) dos níveis. É uma troca que alguns jogos estão dispostos a fazer (a Crytek, por exemplo, quer que tudo corra em tempo real, para que não gaste tempo de processamento para criar uma estrutura de aceleração estática.) Outras abordagens de tempo de execução são, por exemplo, a rasterização de software em a CPU e executando consultas de oclusão na CPU (isso é usado pelo mecanismo Frostbite.)
Para uma abordagem realmente moderna, veja Umbra , que é um middleware para consultas de visibilidade. Se você pesquisar um pouco na web, deve encontrar algumas das teses de mestrado que descrevem o início da Umbra.
Conclusão: se você deseja usar um BSP / Octree / no AS dependerá muito do tipo de jogo que você deseja criar. Se seus níveis são principalmente estáticos, você deve aproveitar isso e criar uma estrutura de aceleração estática. Se tudo é dinâmico, é claro que você precisa de outra abordagem.
Para detecção de colisão, eu daria uma olhada no Bullet e PhysX e seus algoritmos de detecção de colisão. Mas meu sentimento é que as soluções físicas estão menos ligadas à visibilidade do que costumavam ser - uma solução física pode querer usar um BVH baseado em GPU; nesse caso, não faz muito sentido tentar usá-lo para consultas de visibilidade.
Sinceramente, não sei o que os motores de última geração estão usando hoje em dia, mas vou lhe dizer o que sei. É fácil ficar confuso entre uma otimização e a estrutura de dados usada para ajudar nessa otimização. Porém, todas as coisas mencionadas abaixo são para otimizações, mas vou apontar quais são as estruturas de dados especificamente.
BSP : Estrutura de dados - Para detectar a interseção entre objetos dinâmicos em movimento e geometria estática do mundo. Costumava ser usado para detecção de colisão e renderização da geometria corretamente sem um zbuffer, mas não é mais usado para renderização, pois temos memória suficiente para o buffer az atualmente. Eles são tecnicamente gerados de maneira um pouco diferente, mas ainda são considerados o mesmo tipo de árvore. Requer pré-processamento.
Octree ou Kd-Tree : Estrutura de dados - usada para determinar quais objetos estão na mesma "célula" ou área para evitar uma verificação n ^ 2 em todos os objetos dinâmicos.
Estes não são os únicos, mas provavelmente são os mais comuns. Também há muitas otimizações que permitem que o mecanismo evite renderizar a geometria em geral. Mas o que se segue apenas seleciona a geometria, e geralmente é para isso que ela é usada:
Portais : tecnicamente não é uma estrutura de dados, mas requer uma estrutura especial para a seleção. Usado para seleção da visibilidade da geometria do mundo e da geometria dinâmica de objetos da visualização. Requer pré-processamento para dividir o mundo em áreas que eu acho. Mas na verdade não implementei isso, então não sei.
Seleção de oclusão : Otimização - usada para seleção de visibilidade para o que você quiser, provavelmente objetos dinâmicos.
Seleção regular de viewport : Otimização - seleciona objetos que não estão na visualização da câmera.
Mais seleção da viewport : Otimização - A seleção regular da viewport pode ser otimizada ainda mais usando um octree. Você pode selecionar células inteiras da octree que estão atrás da câmera ou que não estão em sua exibição. Isso inclui manchas de terreno (se você estiver fora). Tudo o que não for selecionado pela octree, você executará "seleção regular da janela de visualização". Então, o que restar, você renderizará.
Seleção da face posterior : Otimização - seleciona a geometria voltada para fora da câmera para impedir a rasterização. Geralmente feito em hardware se o estado de renderização estiver definido corretamente.
Estruturas de dados de casos especiais:
Árvores AABB ou Árvores da esfera : essas são estruturas de dados de casos especiais. Eles transformam uma forma côncava em convexa. Por exemplo, um personagem com ossos é tecnicamente côncavo. Ele o divide em pequenos pedaços convexos. Pode ser usado como uma otimização para detecção de colisão, seleção de visibilidade de objetos dinâmicos (geralmente) e facilita a realização de testes de interseção por serem convexos. Eles entrariam, digamos, em uma octree, já que geralmente são objetos dinâmicos. Eles também podem ser usados para ajudar na otimização do descarte da oclusão.
Não há motivo para você usar uma única estrutura para representar tudo (como um gráfico de cena). Na minha opinião, seria melhor usar estruturas de dados diferentes para tarefas diferentes, em vez de tentar usar uma árvore de uso geral de algum tipo. Por exemplo, no mecanismo em que estou trabalhando atualmente, planejo implementar uma combinação de árvore BSP / Octree / AABB com as seguintes otimizações: seleção de oclusão, viewport e, é claro, seleção de backface. Isso significa que terei uma árvore bsp, uma octree e provavelmente várias árvores aabb dentro dessa octree.
A seleção das melhores estruturas de dados e algoritmos / otimizações é provavelmente a coisa maior e mais benéfica que você pode fazer pelo seu mecanismo.
Respostas:
Sim, o mecanismo Unreal 3, por exemplo, ainda usa um BSP - principalmente porque é usado durante o processo CSG. O Doom3 / id tech 4 usa portais e acho que li algo que o id Tech 5 está de volta às árvores do BSP. Existem alguns jogos que usam octrees também. No jogo, meu entendimento é que o UE3 mudou para uma abordagem mais dinâmica com consultas de oclusão, mas eu ficaria surpreso se eles não usassem o BSP para pelo menos determinar quais malhas estáticas estão à vista. Outros jogos podem apenas usar o view-frustum culling (Civilization, por exemplo). Realmente depende do tipo de jogo que você procura.
A razão pela qual BSPs e outras coisas ainda estão por aí é porque você não pode fazer muito melhor. Se você tem geometria estática, um BSP é ótimo se você o construir corretamente. No entanto, é necessário escrever um construtor BSP, o que é complicado (mas pode acontecer de graça se a sua solução CSG usa um!) Octrees e soluções mais dinâmicas (como contar com consultas de oclusão para tudo) são mais simples de implementar, têm maior tempo de execução custo, mas não requer pré-processamento (caro) dos níveis. É uma troca que alguns jogos estão dispostos a fazer (a Crytek, por exemplo, quer que tudo corra em tempo real, para que não gaste tempo de processamento para criar uma estrutura de aceleração estática.) Outras abordagens de tempo de execução são, por exemplo, a rasterização de software em a CPU e executando consultas de oclusão na CPU (isso é usado pelo mecanismo Frostbite.)
Para uma abordagem realmente moderna, veja Umbra , que é um middleware para consultas de visibilidade. Se você pesquisar um pouco na web, deve encontrar algumas das teses de mestrado que descrevem o início da Umbra.
Conclusão: se você deseja usar um BSP / Octree / no AS dependerá muito do tipo de jogo que você deseja criar. Se seus níveis são principalmente estáticos, você deve aproveitar isso e criar uma estrutura de aceleração estática. Se tudo é dinâmico, é claro que você precisa de outra abordagem.
Para detecção de colisão, eu daria uma olhada no Bullet e PhysX e seus algoritmos de detecção de colisão. Mas meu sentimento é que as soluções físicas estão menos ligadas à visibilidade do que costumavam ser - uma solução física pode querer usar um BVH baseado em GPU; nesse caso, não faz muito sentido tentar usá-lo para consultas de visibilidade.
fonte
Sinceramente, não sei o que os motores de última geração estão usando hoje em dia, mas vou lhe dizer o que sei. É fácil ficar confuso entre uma otimização e a estrutura de dados usada para ajudar nessa otimização. Porém, todas as coisas mencionadas abaixo são para otimizações, mas vou apontar quais são as estruturas de dados especificamente.
BSP : Estrutura de dados - Para detectar a interseção entre objetos dinâmicos em movimento e geometria estática do mundo. Costumava ser usado para detecção de colisão e renderização da geometria corretamente sem um zbuffer, mas não é mais usado para renderização, pois temos memória suficiente para o buffer az atualmente. Eles são tecnicamente gerados de maneira um pouco diferente, mas ainda são considerados o mesmo tipo de árvore. Requer pré-processamento.
Octree ou Kd-Tree : Estrutura de dados - usada para determinar quais objetos estão na mesma "célula" ou área para evitar uma verificação n ^ 2 em todos os objetos dinâmicos.
Estes não são os únicos, mas provavelmente são os mais comuns. Também há muitas otimizações que permitem que o mecanismo evite renderizar a geometria em geral. Mas o que se segue apenas seleciona a geometria, e geralmente é para isso que ela é usada:
Portais : tecnicamente não é uma estrutura de dados, mas requer uma estrutura especial para a seleção. Usado para seleção da visibilidade da geometria do mundo e da geometria dinâmica de objetos da visualização. Requer pré-processamento para dividir o mundo em áreas que eu acho. Mas na verdade não implementei isso, então não sei.
Seleção de oclusão : Otimização - usada para seleção de visibilidade para o que você quiser, provavelmente objetos dinâmicos.
Seleção regular de viewport : Otimização - seleciona objetos que não estão na visualização da câmera.
Mais seleção da viewport : Otimização - A seleção regular da viewport pode ser otimizada ainda mais usando um octree. Você pode selecionar células inteiras da octree que estão atrás da câmera ou que não estão em sua exibição. Isso inclui manchas de terreno (se você estiver fora). Tudo o que não for selecionado pela octree, você executará "seleção regular da janela de visualização". Então, o que restar, você renderizará.
Seleção da face posterior : Otimização - seleciona a geometria voltada para fora da câmera para impedir a rasterização. Geralmente feito em hardware se o estado de renderização estiver definido corretamente.
Estruturas de dados de casos especiais:
Árvores AABB ou Árvores da esfera : essas são estruturas de dados de casos especiais. Eles transformam uma forma côncava em convexa. Por exemplo, um personagem com ossos é tecnicamente côncavo. Ele o divide em pequenos pedaços convexos. Pode ser usado como uma otimização para detecção de colisão, seleção de visibilidade de objetos dinâmicos (geralmente) e facilita a realização de testes de interseção por serem convexos. Eles entrariam, digamos, em uma octree, já que geralmente são objetos dinâmicos. Eles também podem ser usados para ajudar na otimização do descarte da oclusão.
Não há motivo para você usar uma única estrutura para representar tudo (como um gráfico de cena). Na minha opinião, seria melhor usar estruturas de dados diferentes para tarefas diferentes, em vez de tentar usar uma árvore de uso geral de algum tipo. Por exemplo, no mecanismo em que estou trabalhando atualmente, planejo implementar uma combinação de árvore BSP / Octree / AABB com as seguintes otimizações: seleção de oclusão, viewport e, é claro, seleção de backface. Isso significa que terei uma árvore bsp, uma octree e provavelmente várias árvores aabb dentro dessa octree.
A seleção das melhores estruturas de dados e algoritmos / otimizações é provavelmente a coisa maior e mais benéfica que você pode fazer pelo seu mecanismo.
fonte