OpenGL vs física?

8

Eu sou muito novo em programação de jogos e estou no meu primeiro projeto. Cheguei a um ponto em que preciso de consultoria especializada:

Agora, para que a física do jogo seja capaz de trabalhar com objetos, ela precisa conhecer a posição de cada objeto e sua orientação no espaço 3D. Como parte da simulação e devido aos objetos, os movimentos (mudança de posição) e a orientação (rotação).

Isso significa que o cálculo de rotação e translação é feito duas vezes? Um na física e o outro é feito usando glTranslate e glRotate antes de desenhar o objeto?

IMO isso não deve acontecer. O cálculo da conversão e rotação na parte da física fará com que eles usem a CPU em vez da GPU, o que afetará o desempenho.

Como isso é feito por especialistas e que conselhos você dá sobre a arquitetura eficiente de jogos para lidar com essas situações?

M.Sameer
fonte

Respostas:

17

Existem várias razões pelas quais os pipelines de renderização e física são tradicionalmente mantidos em sigilo. Tenha em mente, como listo estes, que não se trata apenas de jogos. Sua pergunta toca em qualquer aplicativo que use uma tecnologia de renderização em 3D como o OpenGL, seus concorrentes ou precursores.

  • Nem todo aplicativo que usa 3D precisa de física. Lembre-se de que o OpenGL não foi construído apenas para jogos, seu uso abrange tudo, desde simulações médicas a modelagem de estatísticas de vendas, simulações de tráfego aéreo a reações químicas complexas e assim por diante.
  • Qualquer sistema que serve a muitos propósitos se dilui em termos de eficiência. Um pipeline gráfico precisa ser incrivelmente rápido. No momento em que você começa a introduzir pontos em que esse pipeline precisa interagir com outros subsistemas, como a memória principal do sistema (onde reside o código), você experimentará reduções em ordem de grandeza na eficiência. O hardware da sua placa de vídeo é muito especificamente reduzido e ultra-otimizado para o envio de pixels , com um grande custo e muitos anos de pesquisa altamente competitiva.

  • A natureza das estruturas matemáticas e de dados que cercam as operações físicas (particularmente a detecção e resolução de colisões, sem as quais realmente não existe física ) é muito diferente da matemática necessária para a renderização.

  • Existem soluções que lidam com a física em hardware. Mas, diferentemente do modo como representamos, o modo como realizamos a física em qualquer situação difere amplamente. A indicação mais fundamental disso é que a física newtoniana não é única; existem outras maneiras de modelar matematicamente a física que são mais apropriadas em outras situações, como a mecânica hamiltoniana. E particularmente nos jogos, todo jogo individual pode optar por modelar sua física de maneira diferente, seja em 2D ou 3D. Eles nem precisam refletir a física do mundo real! - porque um jogo é um produto da imaginação. Em outras palavras, a física faz parte da dinâmica do jogo e isso pode mudar de jogo para jogo - sem falar em todas as outras soluções às quais tecnologias como o OpenGL são aplicadas.
  • Simular com precisão a física em um nível de vértice por vértice não é, na maioria das vezes, uma opção viável. Dadas as altas contagens de modelos na maioria dos jogos e a dificuldade inerente à detecção de colisões envolvendo poliedros côncavos, não é tão simples quanto calcular a física a partir do modelo fornecido. Para muitos, se não a maioria dos jogos em 3D, volumes delimitadores na forma de cilindros ou caixas são usados ​​para simplificar a detecção de colisões, onde esse tipo de nível de detecção de colisões é necessário. Dada a tecnologia atual, o nível de processamento envolvido não deixaria muito espaço para o restante da lógica do jogo. Até o PhysX da Nvidia exige que os poliedros complexos e côncavos sejam decompostos em poliedros convexos mais simples, para simulação em física.

  • Sua placa gráfica está produzindo perspectiva com as transformações que realiza. Isso é diferente das transformações realizadas na física, que nada têm a ver com a perspectiva em si - é simplesmente calcular posições e orientações básicas em seu mundo. Se você conhece o MVC, entenderá que há uma diferença distinta entre os dados que você mantém em seu aplicativo e como você os apresenta .

O setor de tecnologia da computação é impulsionado pela necessidade e, embora a visualização seja uma necessidade quase universal, as simulações de física não são de modo algum universais, nem como requisito nem em termos de suas respectivas implementações.

Portanto, meu conselho é: pare de se preocupar em ir contra a corrente e comece a se concentrar em como fazer as duas coisas que você precisa fazer: renderização e física. Você não obterá os dados no pipeline de processamento da sua placa de vídeo (CUDA / OpenCl são exceções): você insere triângulos e dados de material, ele bombeia seu mundo 3D como imagem em movimento.


Como um final à parte, sua pergunta não é sem sentido. O desejo de uma base combinada para a física e a renderização, e o fato de que a matemática de ponto flutuante pode ser muito mais lenta que o ponto fixo, mostra-nos por que as tecnologias voxel estão vendo um enorme ressurgimento de interesse: elas simplificam o mundo inteiro até o posicionamento na grade , poliedros convexos alinhados ao eixo. Isso melhora muito o desempenho, reduzindo a quantidade de matemática vetorial de ponto flutuante necessária para operações físicas, pois agora você trabalha principalmente em uma grade espacialmente subdividível, instável e indexada por número inteiro. Essa mesma grade pode ser usada para renderização e física, principalmente porque você pode usar diferentes resoluções de grade para esses dois subsistemas distintos (ao usar uma solução baseada em octree, como SVOs).

Nick Wiggill
fonte
3
O quinto ponto de marcador precisa ser mais enfatizado: você geralmente usa geometria de colisão separada da geometria visual.
jhocking 27/08/11
Sua resposta é muito perspicaz. Muito obrigado. Eu estive pensando em usar o OpenCL para código de física. Isso fará com que as operações de transformação da matriz que venho falando sejam executadas na GPU e deva dar um pouco de melhora no desempenho. O que você acha: é uma boa ideia?
M.Sameer
3
É um prazer. "Devemos esquecer pequenas eficiências, digamos, 97% das vezes: a otimização prematura é a raiz de todo mal" - Donald Knuth. Concentre-se na sua lógica e otimize conforme e onde você precisar. Você está muito preocupado com o desempenho no que presumo ser um estágio muito inicial do desenvolvimento do seu jogo. É muito fácil retardar mais as coisas ao compartilhar o processamento entre a CPU e a GPU, como no CUDA / OpenCL. Google "CUDA lento", você encontrará muitos resultados. O que você envia para a GPU deve ser enviado em lote com muito cuidado. Não espere fazer gravações a cada poucos milissegundos etc.
Engenheiro