Como renderizo um espelho ou outras superfícies refletivas?

16

Eu só queria saber como criar um espelho dentro de um jogo em 3D? Minha sugestão é / era traçar raios, atingindo o objeto "espelho" e, em seguida, desenhando a imagem de uma segunda câmera no objeto "espelho" localizado no "ponto" do espelho da câmera original, usando o lado atingido do objeto espelho como plano de espelhamento.

Teríamos que usar o único raio vindo do centro da câmera original para determinar o ponto em que o centro da visão está localizado no plano do espelho.

daemonfire300
fonte
1
Gostaria de ter um esboço / desenho de "como eu quis dizer" essa coisa?
Daemonfire300 29/09/10
Você pode tentar postar isso no stackoverflow.com, pois não está diretamente relacionado ao desenvolvimento de jogos; talvez haja mais especialistas em gráficos por lá que possam ajudá-lo.
Ricket 29/09/10

Respostas:

14

Se você estiver usando o OpenGL, a seção FAQ do OpenGL 9: Transformações aborda exatamente como fazer isso. E não, não envolve raytracing, pois é compreensivelmente uma maneira muito ineficiente (mas de alta qualidade) de fazer isso.

9.170 Como renderizo um espelho?

Aqui está essencialmente o que a entrada da FAQ diz e o código de exemplo demonstra:

  • Configure uma matriz de vista refletida. Fazer isso para espelhos alinhados a eixos é explicado no segundo parágrafo.
  • Desenhe a cena
  • Restaure a matriz da vista e limpe o buffer de profundidade
  • Renderize a cena novamente; a geometria do espelho real nesta cena deve ser translúcida ou totalmente transparente, para mostrar a cena espelhada renderizada anteriormente.

Obviamente, há muito espaço para otimização. Ao renderizar a cena refletida, você provavelmente deve selecionar o máximo possível, pois os espelhos são pequenos e a seleção padrão fora da tela não entra na geometria que está na tela, mas não é vista através do espelho. Você também pode renderizar apenas uma versão simplificada da cena através do espelho. Para efeitos e para obscurecer o usuário de perceber a qualidade reduzida, você pode aplicar um sombreador (por exemplo, desfoque, ou talvez brilhante / desbotado) ao fazer sua renderização espelhada.

Imagino que, se você estiver usando o DirectX, o procedimento seria o mesmo.

Ricket
fonte
3
Uma alternativa, se você tiver mais memória do que o tempo de renderização, é simplesmente refletir a geometria do seu mundo através do espelho no seu editor 3D, então você pode modificá-la para ter a aparência que desejar (imponha níveis de mip mais baixos etc.). Fizemos isso no PS1, onde as coisas sentadas em um piso brilhante eram duplicadas / invertidas no subsolo, e o próprio piso ficava semitransparente.
dash-tom-bang
Observe que o código de amostra se refere à especificação OpenGL obsoleta. No entanto, o conceito é universal e provavelmente pode ser aplicado de forma semelhante usando a mais recente especificação OpenGL .
Patryk.beza 7/12/15