Pergunta

Eu estou trabalhando em um jogo 2D. Imagine um plano XY e você é um personagem. Como seu personagem anda, o resto da cena vem à vista.

Imagine que o plano XY é muito grande e há outros personagens fora de sua visualização atual.

Aqui está a minha pergunta, com OpenGL, se esses objetos não são prestados fora da vista actual, comem-se o tempo de processamento?

Além disso, quais são algumas abordagens para evitar que partes da cena prestados que não estão em vista. Se eu tiver um cubo que é de 1000 unidades longe da minha posição atual, eu não quero esse objeto prestados. Como eu poderia opengl não tornar essa.

Eu acho que o mais fácil se aproxima é calcular a posição e, em seguida, não chamar esse cubo / objeto se ele está muito longe.

Foi útil?

Solução

Se você configurar seu grafo de cena corretamente objetos fora de seu campo de visão deve ser abatidos no início do gasoduto display. Isso vai exigir uma verificação de caixa em seu código para verificar se o objeto é invisível, então haverá alguma sobrecarga de processamento (mas não muito).

Se você organizar seus objetos em uma hierarquia sensata, então você pode abater grandes seções da cena com apenas um cheque caixa.

Outras dicas

OpenGL FAQ em "Clipping, Abate e visibilidade Testing" diz o seguinte:

OpenGL não fornece nenhum suporte direto para determinar se um dado primitivo será visível em uma cena para um determinado ponto de vista. Na pior das hipóteses, um aplicativo vai precisar para realizar esses testes manualmente. A pergunta anterior contém informações sobre como fazer isso.

Vá em frente e leia o resto dessa ligação, tudo é relevante.

Normalmente o aplicativo deve executar essas otimizações - OpenGL é literalmente apenas a parte de processamento, e não executa gerenciamento de objetos ou qualquer coisa assim. Se você passar em dados para algo invisível que ainda tem para transformar as coordenadas relevantes para o espaço vista antes que ele pode determinar que é totalmente fora da tela ou além um de seus planos de corte.

Existem várias maneiras de abate objetos invisíveis do pipeline. Verificando um objeto está por trás da câmera é provavelmente o cheque mais fácil e mais barato para executar desde que você pode rejeitar meia definidos, em média, com um cálculo simples por objeto os seus dados. Não é muito mais difícil de executar o mesmo tipo de teste contra o frustrum visão real para rejeitar tudo o que não é de todo visível.

Obviamente, em um jogo complexo que você não vai querer ter que fazer isso para cada objeto minúsculo, por isso é típico para agrupá-los, seja hierarquicamente (ex. Você não iria tornar uma arma se você já determinou que você 'não está tornando a personagem que detém), espacialmente (por exemplo. dividindo o mundo em uma grade / quadtree / octree e rejeitando qualquer objeto que você sabe que está dentro de uma zona que já foi determinado é atualmente invisível), ou mais comumente uma combinação de ambos.

"o único movimento vencedor é não jogar"

Cada glVertex etc vai ser um desempenho atingido independentemente de se tratar, em última análise é renderizado na tela. A única maneira de contornar isso é para não chamar (ou seja, abate) objetos que rotina sempre ser prestados de qualquer maneira.

método mais comum é ter um volume de visualização amarrado a sua câmera. Junte isso com um octtree ou quadtree dependendo se o jogo é em 3D / 2D para que você não necessidade de verificar cada objeto único jogo contra o tronco.

O condutor subjacente pode fazer alguma abate nos bastidores, mas você não pode depender de que, uma vez que não é parte do padrão OpenGL. Talvez o motorista de seu computador faz isso, mas talvez alguém do (que pode executar o seu jogo) não. É melhor para você fazer a sua própria abate.

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