Unity Spain

Mesa de ayuda => Unity3D => Interfaz => Mensaje iniciado por: Jhonatan00_00 en Marzo 15, 2020, 07:38:30 PM

Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 15, 2020, 07:38:30 PM
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 !!.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: nomoregames en Marzo 15, 2020, 07:47:31 PM
Si estas trabajando en 2D, modifica el eje Z para llevar la imagen por encima de las demás
 
 
 
 
 
Espero serte util
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: lightbug en Marzo 15, 2020, 08:14:05 PM
Cita de: Jhonatan00_00 date=1584297510Buenas 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 (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.
 
 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: J Montes en Marzo 15, 2020, 11:16:57 PM
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.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 16, 2020, 01:37:41 PM
Gracias a todos por responder!!. 
 
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.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: nomoregames en Marzo 16, 2020, 03:18:13 PM
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
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 16, 2020, 06:35:16 PM
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 (https://docs.unity3d.com/ScriptReference/Rendering.RenderQueue.html)
 
 
 
 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: nomoregames en Marzo 16, 2020, 07:38:28 PM
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 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: francoe1 en Marzo 16, 2020, 08:58:01 PM
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.
 
(http://1.bp.blogspot.com/-hHUPDzvhPIo/UXP2wY1dPTI/AAAAAAAAIV4/4ppzEDatbps/s1600/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!
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 19, 2020, 01:33:59 PM
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!!. 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: francoe1 en Marzo 19, 2020, 09:28:47 PM
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!
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 22, 2020, 02:59:49 PM
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... 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: J Montes en Marzo 22, 2020, 05:38:33 PM
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:
 

 
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.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 22, 2020, 09:01:11 PM
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!!. 
 
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?. 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: francoe1 en Marzo 22, 2020, 11:25:56 PM
Para este tipo de cosas necesitas POST-EFFECTS
 
Te recomiendo sigas esto como para tener una idea 
 


   
eature=oembed">

 
 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 23, 2020, 10:16:15 PM
Por lo que veo en el vídeo esta persona sabe programar lo que yo no voy a llegar a aprender en toda mi vida, pero por eso mismo ha realizado el Fade In/Out de la manera mas compleja que se te puede ocurrir y tampoco creo que me sirva para lo que yo estoy tratando de hacer (o no he entendido nada del video), que es hacer transparente la imagen que capta una de las cámaras y después que vaya apareciendo poco a poco...
 
Para esto del FadeIn/Out lo que yo he hecho ha sido crear un Canvas, darle el tamaño de la pantalla y el color que yo quiera y por script tocar su transparencia para que la pantalla se encienda o se apague, no tiene mas historia. Lo complicado es cuando quieres hacer lo mismo con un personaje 3D o un objeto 3D y que aparezca progresivamente, no encuentro la forma.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: francoe1 en Marzo 23, 2020, 11:27:04 PM
Para qué objeto aparezca progresivamente deberias modificar el alpha del material.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 24, 2020, 09:41:32 AM
Buenos días Francoe1, eso es lo primero que hice y lo mas sencillo, pero los objetos 3D no actúan como los objetos 2D al hacerse transparentes. Una imagen 2D al no tener fondo si no que es plana simplemente se hace transparente y ya está, pero un objeto 3D como puede ser un cubo, cuando es semitransparente deja ver sus 4 caras. Si aplicamos esto a un personaje se puede ver como está modelado, que es hueco por dentro e incluso me genera fallos como caras invertidas, etc... No funciona.
 
Lo que yo necesito es que ese personaje se haga transparente como si fuese 2D.
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: francoe1 en Marzo 24, 2020, 03:53:22 PM
@Jhonatan00_00, Claramente te entendi de ante manos, por eso te comentaba que para el efecto en 3D deberias utilizar Post Procesado, digamos que un objeto 3D es eso y nada más, no se puede comportar como 2D por que si, si bien se puede desarrollar shaders para que las caras de atrás no se rendericen y encontrar una forma de renderizar todo lo no afectado por el alpha entonces podrias crear algo similar. Si queres lograr este efecto de modificar el Culling y Z-depth para obtener un alpha por shaders deberias aprender a utilizar shaders, la guia oficial esta bastante bien para los conceptos basicos. https://docs.unity3d.com/Manual/ShadersOverview.html
 
Contenido de interés para realizar shaders.
 
http://wiki.unity3d.com/index.php?title=AlphaVertexLitZ (https://docs.unity3d.com/Manual/ShadersOverview.html)
 
https://github.com/andydbc/HologramShader (https://github.com/andydbc/HologramShader)
 
https://forum.unity.com/threads/transparent-depth-shader-good-for-ghosts.149511/ (https://forum.unity.com/threads/transparent-depth-shader-good-for-ghosts.149511/)
 
https://forum.unity.com/threads/question-about-zwrite-and-transparency.529054/ (https://forum.unity.com/threads/question-about-zwrite-and-transparency.529054/)
 
 
Título: Orden de Renderizado (SOLUCIONADO)
Publicado por: Jhonatan00_00 en Marzo 24, 2020, 11:19:25 PM
Gracias!!. No puedo indicar mas de un comentario como solución al problema del hilo por lo que he marcado el que soluciona lo que indica el titulo, pero he podido solucionar también lo de la transparencia gracias al último mensaje de Francoe1. Es una pasada lo que logran hacer con Shader. 
 
Viendo tutoriales, leyendo y aprendiendo un poco mas he podido simplificar todo mucho para poder crear un Shader con transparencia y que su vez tenga BumpMap, pero hay un problema y es que aún no me deja tocar el grado de transparencia. Muevo la barra de colores y el objeto si cambia de color, pero muevo la de la transparencia y no hace nada.
 
El Shader que he creado es este:
 

Shader "Custom/Transparent" {
Properties {
   _MainTex ("Base (RGB)", 2D) = "white" {}
   _BumpMap("Bump Map", 2D) = "bump" {}
   _Color ("Main Color", Color) = (1,1,1,1)
   
}
SubShader {
   Tags { "RenderType"="Transparent" }
   
   CGPROGRAM
   #pragma surface surf Lambert
   sampler2D _MainTex;
        sampler2D _BumpMap;
        fixed4 _Color;
   struct Input {
      float2 uv_MainTex;
      float2 uv_BumpMap;
   };
   void surf (Input IN, inout SurfaceOutput o) {
      half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
      o.Albedo = c.rgb;
      o.Alpha = c.a;
      o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
   }
   ENDCG
}
FallBack "Diffuse"
}

 
A ver si alguien puede ayudarme.