El renderizado nativo en primera persona es compatible con funciones que suelen ser necesarias al crear experiencias con una cámara en primera persona, como la posibilidad de renderizar solo ciertos objetos con un campo de visión distinto al que se usa para el resto de la escena. Por ejemplo, elementos como las manos y los brazos del personaje o las armas son ideales para renderizarlos mediante el renderizado en primera persona, de modo que no atraviesen (ni sobresalgan en) las paredes al acercarse a ellas.
El renderizado en primera persona ofrece las siguientes características:
Renderizado de elementos primarios en primera persona con un campo de visión (FOV) personalizado.
Aplicación de un factor de escala a los elementos primarios en primera persona para reducir su tamaño de forma efectiva y acercarlas a la cámara, lo que permite evitar la mayoría de los casos en los que la geometría de primera persona produce una intersección (lo que se suele llamar recorte) con la escena. Esto permite a los elementos primarios de primera persona renderizar siempre en la parte superior de la escena.
Incluye una solución completa de sombreado en la que la geometría en primera persona recibe las sombras de la escena, las proyecta sobre sí misma y los jugadores pueden ver cómo se proyecta su propia sombra sobre la escena.
Tiene integración con el trazado de rayos por hardware (HWRT), por lo que los jugadores pueden verse reflejados en la escena y pueden proyectar sombras con trazado de rayos.
Integración con materiales:
Control por vértice sobre el efecto en primera persona. Esta salida opcional permite interpolar entre el espacio global y lo que se considera espacio en primera persona. Es útil cuando es necesario que algunas partes de la geometría estén en el espacio global para conectarse con el mundo, como cuando los personajes tienen los pies en el suelo.
Usa el grafo de material para consultar los parámetros de renderizado en primera persona y para transformar posiciones arbitrarias del espacio global al espacio en primera persona.
Funciona en la mayoría de los tipos de elementos primarios. Esto incluye las mallas estáticas, las mallas articulables y los efectos de partículas de Niagara.
Implementación del renderizado en primera persona
A la hora de desarrollar juegos en primera persona, lo más recomendable suele ser que la cámara del jugador renderice la geometría en primera persona de forma que tenga un campo de visión personalizado y no intersecte con el mundo. La implementación del renderizado en primera persona en Unreal Engine puede entenderse como una transformación de la geometría de primera persona de modo que se logre el efecto deseado de un campo de visión personalizado y se evite el fenómeno de recortes. Esta transformación ocurre después de que se aplique la compensación de la posición global, pero antes de que el vértice se proyecte en el espacio de recorte.
En consecuencia, la geometría existe técnicamente en el espacio global, pero en su mayor parte parece estar renderizada con una matriz de proyección diferente. El problema es que ahora la geometría es muy pequeña y está ligeramente sesgada. Esto se hace para que tenga buen aspecto desde el punto de vista de la cámara, pero no es adecuado para otras perspectivas y, por tanto, no debería proyectar sombras en la escena ni ser visible en reflejos de trazado de rayos por hardware, algo que se previene por defecto.
La ventaja de implementar el renderizado en primera persona de esta manera es que permite que los elementos primarios en primera persona se rendericen en la misma pasada que otros elementos primarios, evitando así la necesidad o la complejidad de pasadas de renderizado adicionales que afectarían a la memoria y el rendimiento.
Ajustes de elementos primarios en primera persona
Los componentes incluyen un ajuste para determinar cómo los renderiza la cámara en primera persona cuando su tipo de elemento primario en primera persona está establecido como First Person o World Space Representation.
Este ajuste incluye la siguiente selección:
None: Este elemento primario no interactúa con el renderizado en primera persona.
First Person: Este elemento primario se renderiza en primera persona y se ve afectado por las propiedades de primera persona de la cámara para el campo de visión en primera persona y la escala en primera persona, que se usan para renderizar el componente con distintos campos de visión y un rango de profundidad menor, de modo que se pueda evitar el recorte con la escena. El elemento primario no proyecta sombras en la escena y tampoco será visible en el mundo del trazado de rayos.
World Space Representation: este elemento primario representa un elemento primario en primera persona en el espacio global. Este es el elemento primario que verían los demás jugadores y se utiliza para proyectar sombras en el suelo y para reflejos con trazado de rayos por hardware, entre otras cosas. Es invisible para la cámara en primera persona propietaria. Esto establece de forma implícita que en segundo plano la opción de proyectar sombra oculta esté deshabilitada y la de que el propietario no la vea esté habilitada, lo cual es necesario para que las sombras en primera persona funcionen correctamente con los mapas de sombras virtuales.
Sombras en primera persona
Hay que tener en cuenta dos aspectos de sombreado a la hora de establecer un personaje jugable con el renderizado en primera persona:
Activar las luces para proyectar sombras de forma que los elementos primarios establecidos en primera persona puedan proyectar sombras sobre sí mismos.
Configurar componentes que sean la representación en el espacio global de los elementos primarios en primera persona para las sombras y reflejos de escena.
Sombra propia en primera persona
El sombreado propio en primera persona es una solución de sombreado especializada para elementos primarios renderizados en perspectiva de primera persona. Permite que estos elementos primarios en primera persona proyecten sombras sobre sí mismos, como cuando un arma proyecta una sombra sobre sí misma y sobre el brazo del jugador, pero no sobre la escena. Esto evita que la geometría, que se ha deformado y sesgado para adaptarse a la perspectiva de la cámara en primera persona, sea visible en las sombras de la escena.
Ahora mismo, el sombreado propio en primera persona se implementa con el trazado del espacio en pantalla. Aunque este método es bastante económico, se limita solo a los generadores de sombras que están en pantalla. Para la mayoría de configuraciones en primera persona, esto no será un problema en la práctica, ya que todos los elementos relevantes que proyectan sombras suelen estar en pantalla. Ten en cuenta que otras limitaciones típicas del renderizado del espacio en pantalla también se aplican al renderizado en primera persona, como un búfer de profundidad de una sola capa (los rayos pueden ir detrás de la geometría).
A continuación, se muestran ejemplos con una luz direccional que tiene activado la sombra propia en primera persona.
Ahora mismo (en la versión 5.6), la sombra propia se controla con variables de consola. Esto se ha hecho así para que fuera más fácil controlar el efecto en mapas con muchas luces. El efecto solo supone un coste de rendimiento si la luz se superpone con la geometría en primera persona, así que, suponiendo que haya pocas luces superpuestas o no las haya, no hay problema en activarlo en todas las luces locales. Sin embargo, esta forma de controlar la función podría cambiar en el futuro. Si quieres configurar la sombra propia en primera persona, sigue estos pasos:
Establece
r.FirstPerson.SelfShadowen1. Esto activa la función en las luces que proyectan sombras (proyectar sombras dinámicas) tal y como determina la siguiente variable de consola:Establece
r.FirstPerson.SelfShadow.LightTypesen:0, activa la sombra propia en primera persona solo con luces direccionales.1, la activa solo para las luces locales.2, la activa en todas las luces (locales y direccionales).
Activar la sombra propia en primera persona sí que tiene un pequeño impacto en el rendimiento. Si hay muchas luces superpuestas y está activada, podría tener un efecto negativo sobre el rendimiento. Ten en cuenta las fuentes de luz con las que estás activando esta opción. Para obtener más información sobre las limitaciones de esta función, consulta la sección Limitaciones más abajo.
Sombras de representación en el espacio global para primera persona
Cuando tienes un personaje jugable en primera persona que tiene la propiedad First Person Primitive Type establecida en First Person, estos componentes no proyectan sombras sobre la escena. Para proyectar una sombra es necesario tener una malla que el mundo y otros jugadores vean, y su tipo de elemento primario debe establecerse en World Space Representation. Una vez se ha establecido, esta malla proyectará sombras sobre la escena, además de hacer que este elemento primario sea visible en los reflejos del trazado de rayos por hardware.
Cómo configurar una cámara en primera persona
Al establecer una cámara para un renderizado en primera persona, la complejidad dependerá del tipo de experiencia de juego que estés creando. Puedes seguir los pasos de la siguiente configuración básica para empezar a crear un personaje jugable en primera persona. La configuración avanzada sirve de guía para configurar partes de tu personaje que el mundo u otros jugadores en un juego multijugador ven.
Por ejemplo, en una configuración básica, se configuraría un personaje solo con componentes que verías en una perspectiva en primera persona. Puede ser una malla esquelética con solo brazos para sujetar un arma. En una configuración avanzada, puedes añadir piernas visibles en primera persona y una malla completa del personaje que sea visible para el mundo para proyectar sombras y aparecer en los reflejos.
Configuración básica de una cámara en primera persona
El proceso de creación de una cámara en primera persona es bastante sencillo. Los elementos primarios se pueden etiquetar como si fueran de primera persona y las cámaras se pueden configurar para aplicar un campo de visión personalizado y cambiar la escala de estos recursos de forma independiente del resto del renderizado de la escena.
Los pasos para hacerlo se pueden dividir en dos categorías:
Configuración de los componentes y sus ajustes iniciales.
Configuración de las propiedades de estos componentes para que encajen con el aspecto de tus elementos primarios y del juego en primera persona.
Configuración de los componentes de cámara y primera persona
Sigue estos pasos para configurar la cámara y sus componentes de primera persona:
Crea un nuevo actor de cámara.
En el panel de detalles, haz clic en Añadir y selecciona el componente de elemento primario que quieras (malla estática, malla esquelética, sistema de partículas, etc.) para añadirlo a este actor.
Aunque no es necesario, se considera una buena idea hacer esto, ya que garantiza que la cámara sea el propietario de los elementos primarios de primera persona, lo que es una propiedad importante para configuraciones más avanzadas en las que se requieren los indicadores Owner No See y Only Owner See.
Con el componente de elemento primario seleccionado, utiliza el panel de detalles para localizar la propiedad First Person Primitive Type en Renderización > Avanzado. Utiliza el menú desplegable para establecer la opción First Person.
En el panel de detalles, haz clic en el componente de cámara y marca las casillas junto a Enable First Person Field Of View y Enable First Person Scale, dentro de las propiedades de opciones de cámara.
Con el componente de cámara seleccionado, puedes observar los resultados en la ventana de previsualización de la cámara en la esquina inferior derecha del visor del editor.
Cómo configurar el campo de visión y los ajustes de escala en primera persona
Cuando hayas activado las propiedades del componente de cámara para Enable First Person Field of View y Enable First Person Scale, podrás usar los ajustes con nombres similares de la categoría Cámara Settings para realizar ajustes.
Estos ajustes funcionarán para esta cámara en cualquier elemento primario que tenga su tipo primitivo de primera persona establecido en primera persona. De lo contrario, la cámara los verá en el espacio del mundo. Usa la ventana de previsualización de cámara del visor para ver los cambios. El visor del editor seguirá mostrando los elementos primarios de primera persona sin cambios. Esto se debe a que la cámara implícita que se utiliza para el visor no tiene configurada las propiedades de primera persona.
Puedes ajustar el valor First Person Field of View para cambiar el campo de visión horizontal (en grados) de cualquier elemento primario que renderice esta cámara en primera persona. Al ajustar el regulador del campo de visión, verás cómo cambia el campo de visión del elemento primario en la ventana de previsualización de la cámara.
Puedes ajustar el valor de First Person Scale para reducir la escala de elementos primarios de “primera persona” hacia la cámara de modo que sean lo suficientemente pequeñas como para que no interseccionen con la escena para esta cámara de primera persona. Desde el punto de vista de la cámara, el elemento primario debería tener exactamente el mismo aspecto, aunque ahora es más pequeño. Cuando el valor de escala es demasiado bajo, el elemento primario desaparece. Esto se debe a que se ha escalado a un tamaño lo suficientemente pequeño como para intersectar el plano de recorte cercano.
Al ajustar la escala para una configuración adecuada con la cámara y los elementos primarios, deberías encontrar un valor de escala que sea lo suficientemente bajo como para no provocar el recorte en la escena, pero que sea lo suficientemente alto como para no desaparecer debido al plano de recorte cercano. En la práctica, suele bastar con reducir la escala de la geometría de primera persona solo tanto como sea necesario para que quede incluida en los límites del jugador.
En función del contenido y la configuración, puede que sea necesario ajustar el valor predeterminado de Near Clip Plane para el editor. Puedes ajustarlo en la configuración del proyecto en Motor > Configuración general con Plano de recorte de cercanía, pero esto lo ajusta globalmente para todo el proyecto.
La configuración avanzada de la cámara y los componentes de primera persona es similar a la configuración básica descrita anteriormente para esta vista. Al usar la configuración avanzada que aparece a continuación, deberás tener en cuenta cómo se representa el personaje en el mundo de un juego multijugador o cómo se representa en las escenas del juego utilizando el trazado de rayos por hardware. Esto garantiza la coherencia en la forma en que el mundo (u otros jugadores) ven al jugador a su alrededor. También afecta a cómo el jugador ve a su personaje en las sombras y los reflejos.
Ten en cuenta lo siguiente a la hora de usar el proceso de trabajo avanzado en primera persona:
Añadir elementos primarios de representación del espacio global para proyectar sombras en el mundo.
los pies de un personaje en primera persona y que los pies se conecten con las sombras que el jugador proyecta sobre el suelo.
Reflejos de los jugadores al verse a sí mismos con reflejos del trazado de rayos hardware.
Todas estas funciones requieren una representación adecuada de los elementos primarios de primera persona en el mundo. Esa representación es lo que verán los demás jugadores en un juego multijugador cuando miren a este jugador. También puedes considerarlo la versión en tercera persona del personaje jugable. En Unreal Engine, esto se denomina representación del espacio global en primera persona. Se utiliza para proyectar sombras en la escena y así es como se representa al jugador en la escena de trazado de rayos.
Geometría de primera persona
La geometría de primera persona debería incluir una malla para la parte inferior del cuerpo y las piernas. Esta malla puede estar completamente en el espacio global o podrías usar un gradiente de interpolación en el material para tener los pies completamente en el espacio global, y el resto del cuerpo en el espacio de primera persona (consulta la sección Integración con materiales más adelante).
Esta configuración por sí sola mejorará el realismo, ya que ahora los jugadores pueden verse sus propias piernas al mirar hacia abajo en la vista en primera persona.
Configuración de componentes de primera persona y sus representaciones en el espacio global
En la configuración básica de una cámara en primera persona, los componentes que quieres que solo vea la cámara en primera persona tienen la opción Tipo de primitiva en primera persona establecida en Primera persona. Para cualquier geometría que quieras que elementos como los reflejos de trazado de rayos por hardware u otros jugadores en juegos multijugador vean en el espacio global, puedes establecer el tipo primitivo en World Space Representation, y esto garantizará que puedan proyectar sombras sobre el mundo y tener una representación del jugador en los reflejos con trazado de rayos.
En la escena de abajo, hay dos cosas que hay que tener en cuenta al ajustar un componente a World Space Representation:
El componente ya no será visible para la cámara en primera persona en la ventana de previsualización de cámara.
El componente proyecta una sombra sobre el mundo.
Internamente, la opción de representación en el espacio global utiliza la funcionalidad “Owner No See” para ocultar la geometría a la cámara, pero esto requiere que los elementos primarios pertenezcan a la cámara, lo cual se puede lograr si se configuran como componentes hijos del actor de cámara.
Una vez que tengas un personaje configurado con un elemento primario de malla en primera persona y otro elemento primario de malla de representación en el mundo, los pies de la malla en primera persona deberían alinearse con los de su representación en el mundo. A continuación, verás un ejemplo de esta configuración, centrado solo los elementos primarios de primera persona y, luego, los elementos primarios combinados de primera persona y el mundo para proyectar sombras en la escena y hacer que estas “conecten” las sombras a los pies de tu personaje.
Solo se muestra el elemento primario de malla de primera persona que tenga activada la opción “First Person”. Esta malla no proyecta sombras en la escena. | Tanto los elementos primarios de malla establecidos para primera persona como para la representación del mundo se muestran juntos. La malla de representación del mundo es invisible para la cámara en primera persona, pero proyecta sombras sobre el mundo. Deberían alinearse con la malla del elemento primario de primera persona. |
Para el mundo, o para cualquier otro jugador en una configuración multijugador, la malla y los componentes de tu personaje deberían establecerse como representación de espacio global.
La demostración de abajo muestra una cámara de “mundo” que enfoca al personaje en primera persona reflejado en una superficie similar a un espejo. También puedes ver la vista de la cámara de primera persona y cómo se ve la malla de representación del espacio global cuando se establece como None, First Person o World Space Representation, y cómo esto afecta a su capacidad de proyectar sombras en la escena o de ser renderizado por la cámara en primera persona.
Integración con materiales
El grafo de materiales incluye los siguientes nodos compatibles con las configuraciones de renderizado en primera persona:
Nodo First Person Output
El nodo First Person Output utiliza un valor alfa para interpolar entre el espacio global y el espacio en primera persona mediante valores entre 0 y 1 en una frecuencia por vértice. Esto es muy útil si la geometría de primera persona necesita conectarse con el resto de la escena. Un ejemplo sería conectar la malla de los pies de la geometría del personaje en primera persona con el suelo. Puedes conseguirlo aplicando un intervalo entre 0.0 (espacio global) y 1.0 (espacio de primera persona) a lo largo de las piernas (que se establecerían como un elemento primario de primera persona).
También puedes utilizar Set Material Attributes para establecer la misma propiedad sin necesidad de añadir el nodo de salida en primera persona al material. Esto es útil en los casos en los que quieres establecer el valor de una función de material, ya que las funciones de material no permiten el uso de nodos de salida personalizados.
Nodo Transform Position
El nodo Transform Position permite transformar posiciones arbitrarias al espacio en primera persona. Esto es útil para calcular dónde acabaría un punto en la pantalla cuando se renderiza en primera persona.
Con el nodo seleccionado, usa el panel Detalles para configurar lo siguiente:
Source: Camera Relative World Space
Este es el formato fuente de la posición que se transformará.
Destination: First Person Space (Camera Relative World Space)
Este es el tipo de transformación que hay que aplicar a la expresión de entrada.
(Opcional) First Person Interpolation Alpha: 0 a 1
Esto interpola entre el espacio del mundo trasladado y el espacio de primera persona, siendo 0 el espacio global y 1, el espacio de primera persona. Este nodo puede utilizarse con cualquier material, incluidos los materiales posprocesados, donde puede utilizarse para transformar cualquier posición arbitraria a primera persona para que no podamos conocer el valor del nodo First Person Output. Este valor lo proporciona el usuario para lo que tenga sentido para su juego, pero en la mayoría de los casos, es sensato dejar el valor por defecto.
Un ejemplo de cuándo utilizar este nodo es al calcular dónde debería estar la retícula en primera persona para algo como el material de posprocesado de un arma con mira. En este caso, se puede asumir que todas las posiciones de las que hay que ocuparse (los puntos del arma y la mira) serán íntegramente en primera persona.
Nodo Is First Person
El nodo Is First Person se puede utilizar para aplicar distintos efectos en el material en función de si el elemento primario que se está renderizando tiene su First Person Primitive Type establecido en First Person o no.
El siguiente grafo de material es una configuración sencilla que utiliza el nodo IsFirstPerson para establecer un color para la geometría que se renderiza en el espacio global (rojo) frente al espacio de primera persona (verde).
En la escena de abajo, puedes ver cómo este material que utiliza el nodo Is First Person controla el color del fusil tanto para su representación en el espacio global como para la vista en primera persona. El elemento primario de fusil en primera persona (verde) se puede ver en la cámara del jugador (parte inferior derecha) y se renderiza con los parámetros de primera persona de la cámara. El fusil de representación del espacio global (rojo) es invisible para la cámara del jugador, pero se usa para proyectar sombras en el suelo y los reflejos y las sombras del trazado de rayos del hardware lo verán en el mundo del trazado de rayos.
Nodo View Property
El nodo de View Property puede utilizarse para consultar el campo de visión de primera persona y la escala de primera persona de la vista actual.
First Person Field of View devuelve los ángulos horizontales y verticales del campo de visión en primera persona, expresados en radianes.
First Person Scale devuelve el factor de escala aplicado a los elementos primarios de primera persona para evitar que intersecten con la escena.
Con el nodo seleccionado, utiliza el panel de detalles para establecer en la lista desplegable View Property en la vista que quieras consultar.
Nodo Scene Texture
El nodo Scene Texture puede muestrear el GBuffer para determinar si un píxel dado lo ha dibujado un elemento primario de primera persona que utiliza un material opaco.
Con el nodo seleccionado, usa el panel de detalles para establecer desde la lista desplegable Scene Texture Id para establecer la textura de escena en IsFirstPerson.
Para obtener más información al respecto, consulta la sección Limitaciones más abajo.
Limitaciones y notas
El campo de visión (FOV) personalizado en primera persona, el cambio de escala antirrecortes, los controles de interpolación por vértice y la mayoría de las funciones de integración de grafo de material funcionan en todas las plataformas y con todas las configuraciones.
Bit del GBuffer para primera persona
Ciertas funciones avanzadas de renderizado en primera persona requieren que los píxeles de la primera persona estén marcados con un bit en el GBuffer.
La primera consecuencia de esto es que estas funciones no funcionan con el renderizador móvil ni con el renderizado directo.
La segunda consecuencia es que Permitir iluminación estática tiene que estar desactivado en los ajustes del proyecto. Al desactivar la iluminación estática en el proyecto, se liberan bits de GBuffer que se pueden utilizar en el renderizado de primera persona.
Es posible que esto cambie en el futuro, pero a en la versión 5.6 es una concesión que hay que hacer. Por otra parte, los usuarios más avanzados podrían optar por hacer cambios locales en su versión de Unreal Engine y sacrificar una función distinta de GBuffer que no sea necesaria para su proyecto.
Las funciones afectadas son las siguientes:
Sombra propia en primera persona
Usar elementos primarios de la representación del espacio global para proyectar sombras en la escena.
Ver los elementos primarios de la representación del espacio global reflejados en la escena.
Utilizar el nodo Scene Texture para saber si un píxel es de primera persona.
Todas estas características cuentan con un elegante recurso de respaldo en caso de que el bit del GBuffer de primera persona no esté disponible: las sombras y los reflejos no estarán ahí y el nodo Scene Texture siempre devolverá 0.0 (falso).
Compatibilidad general de las funciones
Sin el mapa virtual de sombras (o las sombras con trazado de rayos), no habrá sombras en primera persona en el suelo.
Ahora mismo no hay compatibilidad con el renderizado capilar ni los peinados basados en mechones.
Recursos adicionales
Plantilla de primera persona
La plantilla First Person está configurada para utilizar el renderizado nativo de primera persona. Puedes explorar la variante First Person Shooter al crear la plantilla First Person para ver esta función en acción.
Si quieres más información sobre esta plantilla, consulta First Person Template (Plantilla de primera persona).