¿Cartelera renderizada sin distorsión?


8

Utilizo el enfoque estándar de la cartelera en Unity que está bien, pero no es ideal:

transform.LookAt(camera)

El problema es que esto introduce distorsión hacia los bordes de la ventana gráfica, especialmente a medida que el ángulo del campo de visión aumenta. Esto es diferente a la cartelera perfecta que verías, por ejemplo. Condena al ver a un enemigo desde cualquier ángulo e independientemente de dónde se encuentren en el espacio de la pantalla.

Obviamente, hay formas de enviar una imagen directamente a la ventana gráfica, centrada alrededor de un solo vértice, pero no me gustan los sombreadores.

¿Alguien tiene alguna muestra de este enfoque (GLSL si es posible), o alguna sugerencia de por qué no se hace de esta manera (en comparación con el método de transformación cuádruple mencionado anteriormente)?

EDITAR: Estaba confundido, gracias Nathan por el aviso. Por supuesto, hacer que los quads miren a la cámara no hace que sean paralelos al plano de visión, que es lo que necesito.

Respuestas:


4

Estoy confundido por su pregunta porque en una proyección en perspectiva estándar, dibujar una valla publicitaria paralela al plano de vista no introduce distorsión. Es equivalente a pasar la imagen a la ventana gráfica con algo de escala, donde la escala depende de la profundidad (distancia perpendicular desde el plano de vista).

La "distorsión" que está viendo podría ocurrir si el sistema está orientando las partículas hacia la cámara en lugar del plano de visión; eso causa sesgo cerca de los bordes de la pantalla. O bien, es posible que esté viendo que la escala del sprite cambia a medida que gira la cámara, ya que cuando se mide la distancia al plano de visión en lugar de a la cámara, el sprite se "acerca" y, por lo tanto, se hace más grande a medida que se sale de la pantalla.


1
@NickWiggill No estoy familiarizado con Unity específicamente, pero si quieres que los quads miren al plano de vista en lugar de mirar a la cámara, esencialmente configuras la matriz de rotación del quad igual a la matriz de rotación de la cámara. Es posible que necesite una rotación adicional de 180 grados, dependiendo de cómo se construyan los quads.
Nathan Reed

1

Creo que puede configurar la matriz 3x3 superior (en el lenguaje de columna principal) a la identidad para hacer esto. No veo ninguna razón por la que no pueda hacer esto en el sombreador, pero podría estar haciendo más trabajo de esa manera. Perdería escala (en su matriz de xformation) de esta manera.

Editar: este artículo fue útil para mí para vallas publicitarias e impostores:

http://www.flipcode.com/archives/Billboarding-Excerpt_From_iReal-Time_Renderingi_2E.shtml

No sé qué tan convencional es esto, pero lo llamo "imponente" cuando se mantiene la perspectiva y "cartelera" cuando no lo es.


Me di cuenta de algo. Estoy usando Unity iOS / Android, y algunos de los dispositivos más antiguos son OpenGL ES 1.1, por lo tanto, una tubería fija. Entonces, hacerlo sin sombreador es clave aquí. ¿Cómo haría esto sin hacerlo en el sombreador?
Ingeniero

1
Esa es probablemente la forma más barata de hacerlo de todos modos. En mi código, tengo una bandera en mis sprites que dicta si hacer cartelera o impostor antes de hacer llamadas de sorteo. Cuando este es el caso, simplemente tomo la matriz actual, configuro el 3x3 superior en identidad y luego actualizo la matriz actual.
notlesh

Ah ... aprecio los detalles adicionales, pero como no tengo acceso a las llamadas GL (Unity abstrae eso), creo que estoy bastante jodido con este enfoque.
Ingeniero

¿No puede obtener o establecer la matriz actual? Nunca he usado la unidad ... Si no, tal vez intente buscar "cartelera de la unidad" o "
imposición de la
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.