¿Cómo renderizo un espejo u otras superficies reflectantes?

16

Me preguntaba cómo crear un espejo dentro de un juego en 3D. Mi sugerencia es / era rastrear rayos, golpear el objeto "espejo" y luego dibujar una imagen de una segunda cámara en el objeto "espejo" que se encuentra en el "punto" espejo de la cámara original usando el lado golpeado del objeto espejo como Espejo plano.

Tendríamos que usar el rayo que viene del centro de la cámara original para determinar el punto donde se encuentra el centro de la visión en el plano del espejo.

daemonfire300
fuente
1
¿Te gustaría tener un boceto / dibujo de "cómo quise decir" esta cosa?
daemonfire300
Puede intentar publicar esto en stackoverflow.com ya que no está directamente relacionado con el desarrollo del juego; Quizás haya más expertos en gráficos por allí que puedan ayudarlo.
Ricket

Respuestas:

14

Si está utilizando OpenGL, la sección 9 de Preguntas frecuentes de OpenGL: Transformaciones cubre exactamente cómo hacerlo. Y no, no implica el trazado de rayos, ya que es comprensiblemente una forma muy ineficiente (pero de alta calidad) de lograr esto.

9.170 ¿Cómo renderizo un espejo?

Esto es esencialmente lo que dice la entrada de preguntas frecuentes, y el código de ejemplo demuestra:

  • Configure una matriz de vista reflejada. Hacer esto para los espejos alineados por eje se explica en el segundo párrafo.
  • Dibuja la escena
  • Restaurar la matriz de vista y borrar el búfer de profundidad
  • Renderiza la escena de nuevo; La geometría real del espejo en esta escena debe ser translúcida o completamente transparente, para mostrar la escena reflejada previamente representada.

Obviamente hay mucho espacio para la optimización. Al renderizar la escena reflejada, probablemente debería realizar el mayor sacrificio posible, ya que los espejos suelen ser pequeños y el sacrificio fuera de la pantalla predeterminado no se aplicará a la geometría que está en la pantalla pero que no se ve a través del espejo. También puede renderizar solo una versión simplificada de la escena a través del espejo. Para efectos, y para evitar que el usuario note la calidad reducida, puede aplicar un sombreador (p. Ej., Desenfoque, o tal vez brillante / desvaído) cuando realiza su renderizado en espejo.

Me imagino que si usa DirectX, el procedimiento sería muy similar.

Ricket
fuente
3
Una alternativa, si tiene más memoria que tiempo de renderizado, es simplemente reflejar la geometría de su mundo a través del espejo en su editor 3D, luego puede modificarla para que se vea como desee (imponga niveles de mip más bajos, etc.). Hicimos esto en la PS1, donde las cosas que se encontraban en un piso brillante se duplicaban / invertían bajo tierra, y el piso en sí se volvía semitransparente.
dash-tom-bang
Tenga en cuenta que el código de muestra se refiere a la especificación de OpenGL en desuso. Sin embargo, el concepto es universal y probablemente pueda aplicarse de manera similar utilizando la especificación más reciente de OpenGL .
patryk.beza