Jump to content
Sign in to follow this  
Jhonatan00_00

ANSWERED Orden de Renderizado (SOLUCIONADO)

Recommended Posts

Buenas tardes, estoy tratando de hacer un objeto 3D para renderizar siempre sobre los demás objetos del juego, como si tuviera un componente más del menú. Seguro que es una chorrada pero no se hacerlo.

- ¿Como se hace ?.

GRACIAS !!.

Edited by Jhonatan00_00

Share this post


Link to post
Share on other sites
29 minutes ago, Jhonatan00_00 said:

Buenas tardes, estoy tratando de hacer que un objeto 3D se renderize siempre sobre los demás objetos del juego, como si fuese un componente mas del menú. Seguro que es una chorrada pero no se hacerlo.

- ¿Como se hace?.

GRACIAS!!.

Hola, lo podés hacer con un shader.

https://docs.unity3d.com/Manual/SL-CullAndDepth.html?_ga=2.232737049.706841863.1584287748-1007895422.1584287748

Te creas un shader standard (o similar al que estés usando) y le seteas el cull zwrite o ztest (del link).

La verdad es que mucho de shaders no sé, así que más que eso no te puedo ayudar. En el link hay ejemplos.

Si lo que querés es que un menú contenga a un objeto en 3D, la alternative es renderizar dicho objeto en un renderTarget (vas a necesitar una cámara extra). Luego, crear un elemento UI que sea una raw texture (creo que así se llama) y asignar el render target a esta raw texture. Suena super difícil pero no lo es.

 

  • Like 1

Share this post


Link to post
Share on other sites

Yo creo que no es necesario crear un shader para esto. Es mucho liarse para algo que se hace sencillamente dibujando por encima, sin tocar todos nuestros shaders.

El objeto puede dibujarse con otra cámara, y es suficiente. En esa cámara, es importante configurarla para limpiar el "depth buffer" (pero no el render buffer, porque no queremos borrar la imagen que ya está dibujada por la anterior cámara en ese frame). Esa cámara tendrá que tener un Order mayor que la cámara de la escena, para que se dibuje después.

Dependiendo de lo que quieras hacer, sí podrías necesitar renderizar a una textura (para mostrarlo como si fuera una imagen) o cambiar el viewport (para renderizarlo sólamente en su "cuadrado"), o un stencil buffer (para enmascarar en qué parte de la pantalla dibujas). Pero si no lo tienes claro, empieza por dibujar el objeto por encima con otra cámara. Un saludo.

Edited by J Montes

Share this post


Link to post
Share on other sites

Gracias a todos por responder!!. :91_thumbsup:

Veo que es mas complejo de lo que pensaba y me parece que lo mejor será renderizar el objeto 3D desde el programa de modelado y pasarlo a 2D para usarlo como una imagen corriente, de lo contrario el lío puede ser padre... De todos modos Unity debería de tener capas donde indicar que objetos se renderizan en primer lugar. He probado creando un shaders como dice Lightbug y no se hacerlo, no me funciona.

Share this post


Link to post
Share on other sites

En la configuración de cámara puedes ver una imagen 3d con perspectiva 2d

Ahora no recuerdo como pero en cuanto pueda te lo miro... si es eso lo que buscas claro

Share this post


Link to post
Share on other sites

No es eso exactamente nomoregames. Lo que intento es aprender a renderizar un objeto 3D sobre los demás como si se tratara de un objeto 2D para darle multitud de usos... Por ejemplo a parte de para usar un objeto 3D en un menú por ejemplo, ahora mismo necesito poder oscurecer todo el escenario menos el personaje y después hacer que se encienda progresivamente como si aparecieses en ese lugar desde la nada (porque te materializas) y puedo conseguirlo haciendo que todos los materiales sean negros, pero tendría que ir modificando uno por uno el brillo hasta que estuvieses en ese lugar, mientras que poniendo un plano en color negro frente a la cámara y renderizándolo justo después del protagonista podria conseguir el mismo efecto mucho mas fácil.

Se le pueden dar muchas aplicaciones mas, por ejemplo cuando juegas a Tomb Raider y te pierdes, tiene una función que te muestra todos los objetos del escenario a lo lejos, para que puedas dirigirte hacia ellos sin perderte y eso se consigue renderizandolos sobre los demás. Es algo que la mayoría de videojuegos usan y que se debe de poder hacer...

Buscando información parece que la solución debe de andar por aquí: https://docs.unity3d.com/ScriptReference/Rendering.RenderQueue.html

 

 

Share this post


Link to post
Share on other sites

mmmm, no se si es posible pero...

No podrías coger y añadir todos los obj que quieres que se obscurezcan a una capa y hacer que todos los objetos de esa layer se obscurezcan?

Es solo una idea 

Share this post


Link to post
Share on other sites

Hola @Jhonatan00_00, lo que estás buscando es crear formas de representar la geometría, esto se conoce como Shaders, veo que estás tratando de encontrar el camino pero no tienes la suficiente información.

Aplicar shaders para que la geometría se dibuje frente a cualquier otra es bastante simple, pero no es algo genérico, de hecho deberias implementar un sistema de RenderQueue para todos los objetos que se renderizan en primer plano. La idea de @nomoregames es lo que en realidad estas buscando... ¡Solución genérica!.

Pero esto soluciona 1 de varias aplicaciones, digamos, dibujar un personaje sobre el UI debería ser con una CÁMARA extra que renderize únicamente la capa del personaje (siempre que la vista sea interactiva), de lo contrario se podría realizar tranquilamente con RenderTexture.

Para una solución mediante shaders en el caso de Tomb Rider, o Vista de Águila de Assassin's Creed, deberias utilizar Z Test e ingeniarte que Pixeles dibujar y de que manera.

resultsLit.png

Esto es un apartado complejo pero una vez que dominas para que sirve cada cosa es bastante simple lograr el efecto deseado, luego con el tiempo vas aprendiendo a optimizar y demás.

 

 

Para tu ejemplo de renderizar el jugador con un plano negro, podrias usar 2 camaras y renderizar el jugador en 1 cámara y todo el resto en otra cámara, luego puedes indicar el orden de la cámara!

  • Like 2

Share this post


Link to post
Share on other sites

Francoe1 tiene usted que hacer un tutorial para que el mundo entienda como se aplica el RenderQueue, porque lo poco que he encontrado en Internet está en ingles y no he conseguido aún nada con las pruebas que he hecho...

¿Como se hace lo de usar dos cámaras para renderizar el personaje en una y mezclarlas después?, son cosas muy nuevas para mi y no tengo ni idea... Poco a poco por favor!!. :7_sweat_smile:

Share this post


Link to post
Share on other sites

Dentro del TAG del Subshaders podes asignar el valor de Queue, ya existen constantes definidas para no sobre poner las geometrias o demas aplicaciones de Unity, Background es 1000, Geometry es 2000, AlphaTest es 2450, Transparent es 3000 y Overlay es 4000, para que se renderize por encima del UI el valor debe ser entre 4000 y 5000 <- EN TEORIA!

Se usa este orden para poder renderizar todo tipo de materiales de forma correcta,

  1. Renderiza el Background.
  2. Renderiza los Materiales con Shaders (MCS) opacos.
  3. Renderiza Alpha Test.
  4. Renderiza otra vez la geometria con MCS Opaco (Esto suele ser mas complicado de explicar el porque..)
  5. Renderiza los materiales transparentes tomando información del segundo y tercer paso.
  6. Renderiza todo lo que debe estar superpuesto, efectos como flares, etc..

Crear algo similar a RenderQueue es bastante complejo, diria que sin conocimientos seria muy frustrante, por esta razón Unity deja libre 1000 posibilidades por cada sección para que crees el orden de renderizado de tus objetos, es posible que nunca termines de usarlos, seria raro encontrar 1000 materiales con un orden unico.

 

¿Como funcionan las camaras?
SIMPLE, las camaras son entidades que se encargan de renderizar una sección de la escena, esta sección se ve delimitada por varios factores, FOV, FAR, SIZE, etc. 

¿Que renderiza la camara?
La camara renderia los objectos que pertenezcan al LAYER que tenga como Renderizado, y luego tienen un orden de renderizado, por lo que puede renderiar todos los UI en Una Camara, Los Efectos en otra, Las Particulas en otras ETC... Cuando mas o menos entiendas este ejemplo podes aplicarlo a la vista del Personaje dentro de un MENU o el efecto que estas intentando lograr!

  • Like 1

Share this post


Link to post
Share on other sites

Buenas tardes, he estado indagando sobre el tema de usar varias cámaras para renderizar diferentes objetos y supongo que a lo que se refiere es al Render Texture ¿verdad?. No encuentro la forma de indicar en que capa debe de estar cada objeto ni que capa debe de renderizar que cámara. A mi me aparece en opciones de la cámara la función "Depth" que sirve para indicar que cámara se renderizará primero, pero no importa el orden que le de que no hay ningún cambio... :37_disappointed:

Share this post


Link to post
Share on other sites

RenderTexture te permite renderizar una cámara a una textura, y usarla luego en tu escena. Es útil para cosas como espejos retrovisores o cámaras de televisión que ves en un monitor en la propia escena.

Para renderizar en dos pasadas, simplemente activa dos cámaras, y haz que la segunda NO borre el frame buffer (la zona de memoria donde se compone la imagen). En la segunda cámara, tendrás que asegurarte también de renderizar sólo las capas que contienen el objeto que te interesa:

image.png

En Clear Flags, pon "Depth Only", así podrás dibujar por encima del frame buffer habiendo limpiado el z-buffer (porque tu segunda cámara no trabaja en el espacio de la primera seguramente)

En Culling Mask, selecciona la capa que tiene la cámara y el modelo y las luces que te interesan para esa pasada de render (tendrás que crearte una capa para esto).

En ViewPot Rect, selecciona la zona de la pantalla donde quieres que se dibuje la cámara.

En Depth, usa un número mayor que el de tu otra cámara, para que esta pasada se haga después.

  • Like 2

Share this post


Link to post
Share on other sites

GRACIAAAAAAAAAAASSS!!, lo logré!!. Acabo de abrir una puerta a infinitas posibilidades, se pueden hacer montones de cosas con esto de usar varias cámaras para renderizar según que objetos, es una pasada!!. :91_thumbsup:

Solo me falta por saber hacer una cosa. He intentado que un objeto aparezca de la nada materializándose y para ello lo que he usado es un material transparente, el cual primero está completamente transparente y poco a poco va siendo visible. El problema es que cuando es medio transparente se puede ver que el objeto es hueco por dentro y quisiera saber si con esto de usar varias cámaras podría renderizar el objeto y esa imagen que me renderiza la camara hacerla transparente, ¿se puede?. :1_grinning:

Share this post


Link to post
Share on other sites

Para este tipo de cosas necesitas POST-EFFECTS

Te recomiendo sigas esto como para tener una idea 

 

  • Like 1

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...