Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: banics en Enero 29, 2017, 05:34:54 PM

Título: Problema Con Pixel Perfect
Publicado por: banics en Enero 29, 2017, 05:34:54 PM
Saludos a todos.

Un amigo y yo estamos desarrollando un juego para dispositivos moviles en unity (actualemtne en la version 5.5.0f3) 

y tenemos un problema con el pixel art que nos esta volviendo locos.

Tenemos un sprite atlas a x4 de resolucion. La cosa es que no se ve bien en la mayoria de dispositivos (pixeles muy distorsionados).

Para intentar solucionarlo estudiamos como implementar el pixel perfect. Todo bien pero resulta que nuestro juego tiene un escenario 

estatico, el cual siempre debe verse en pantalla (algo asi como leep day y sus paredes horizontales) y somos incapazes de resolverlo, ya que

al ajustar el ortographic size de la camara para intentar que quepa todo , al no ser el tamaño Heigth/2 * ppu) se deforma todo.

Espero que podais orientarme bien par ael pixel perfect, o bien para que los sprites se vean lo mejor posible. 

Gracias de antemano y un saludo.
Título: Problema Con Pixel Perfect
Publicado por: OldGuy en Enero 29, 2017, 06:32:57 PM
Buenas,
 
¿habéis probado a importar las texturas con el Filter Mode en Point? Para gráficos Pixel Art a veces es una buena solución.
 
Un saludo.
Título: Problema Con Pixel Perfect
Publicado por: banics en Enero 29, 2017, 06:37:21 PM
Si, ya que sin ese Filter mode el pixel perfect es inviable XD
Título: Problema Con Pixel Perfect
Publicado por: OldGuy en Enero 29, 2017, 08:44:10 PM
Bueno hay casos en los que a veces es mejor usar bilinear, como por ejemplo cuando la distancia ortográfica está muy alejada.
 
Hay un post en el blog que explica algunos consejos pero supongo que ya lo habrás visto también:
 
https://blogs.unity3d.com/es/2015/06/19/pixel-perfect-2d/ (https://blogs.unity3d.com/es/2015/06/19/pixel-perfect-2d/)
Título: Problema Con Pixel Perfect
Publicado por: lightbug en Enero 29, 2017, 09:33:03 PM
Nunca entendi muy bien el pixelPerfect, osea, es cuando tu camara se mueve un estilo snap to grid, pero de acuerdo a un pixel no? que depende del orthographicSize y resolusion supongo.
 
A mi me pasaba que se veian raro,los tiles cuando les puse un material sprite-difuso, aveces se corrian de muy poquito con el movimiento de la camara y se via el fondo, lo arregle con la opcion pixelperfect del material, creo. Nada que ver con tu problema claro.
 
Te pasa algo como el de este video?
 
https://www.youtube.com/watch?v=yI8JrBNTwkc (//%5Byoutube%5Dhttps://www.youtube.com/watch?v=yI8JrBNTwkc%5B/youtube%5D)
 
 
Título: Problema Con Pixel Perfect
Publicado por: banics en Enero 30, 2017, 12:08:35 AM
Hola, antes de nada gracias por responderme.
 
Si, nos pasa como ese vídeo. Nosotros usamos sprite renderer de componente, quizás si lo pusiéramos como textura se arreglaría?
 
Si usamos bilinear se nos ve mal. he visto tu ejemplo OldGuy,  en el paso uno define nuestro problema, pero no se si lo llega a solucionar. Lo estudiare mas a fondo e iré informando.
 
Gracias de nuevo y un saludo.
Título: Problema Con Pixel Perfect
Publicado por: banics en Febrero 11, 2017, 10:24:08 AM
Hola buenas. Siento al tardanza, he estado liado con temas de trabajo y tal.
 
He ojeado el ejemplo, pero le ocurre lo mismo y no pone como solucionarlo. Es decir, para determinados tamaños o proporciones de pantalla y el escenario se descoloca, ya sea ampliando el vació por las bandas laterales, etc...
 
Me e replanteado lo del pixel perfect, ya que, viendo otros ejemplos, no se puede ajustar para que siempre se vea una proporción determinada del escenario, ya que si le asignas un tamaño al ortographic size que no le corresponde siempre se va a ver mal.... 
 
En fin, no se que hacer XD. Alguien sabe algún consejo para que los pixeles se vean medianamente bien sin recurrir al pixel perfect?
 
Gracias de antemano y un saludo.
Título: Problema Con Pixel Perfect
Publicado por: kingtrase en Febrero 11, 2017, 11:59:11 AM
Os paso el codigo que yo uso, lo tengo de hace tiempo, no es mio pero es free igualmente, a mi me funciona perfectamente.
 
(Lo que hace es ajustar el size a la relacion X e Y de la resolucion de pantalla) Nombre del archivo: PixelPerfect.cs
 

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
 
//PixelPerfect Camera in Unity
//from Marrt
 
public    enum SnapMode {SnapToScreenPixel, SnapToArtPixel};
 
public class PixelPerfect : MonoBehaviour {
 
    public    static PixelPerfect instance;    //make sure only one instance of this script exists
 
    public    Camera        cam;
    public    Transform    camAnchor;
 
    public    Transform    followTarget;
 
    public    SnapMode snapMode = SnapMode.SnapToArtPixel;
                           
    private    float    orthoSize;
    public    float    pxPerUnit        = 100F; //Esto lo cambias segun el pixel per Unit de tus texturas/sprites      
    private    float    subPixelFactor    = 2F;        
 
    private    bool    pixelSnapOn = true;
    private    float    snap = 0F;    
 
    void Awake(){  
        instance = this;  
        Zoom (1F);
    }
 
    void Update(){
        if(Input.GetKey(KeyCode.LeftControl))
        {
        if(Input.GetKeyDown(KeyCode.F1)){Zoom(0.5F);}
        if(Input.GetKeyDown(KeyCode.F2)){Zoom(1F);}
        if(Input.GetKeyDown(KeyCode.F3)){Zoom(2F);}
        if(Input.GetKeyDown(KeyCode.F4)){Zoom(3F);}
        if(Input.GetKeyDown(KeyCode.F5)){Zoom(4F);}    
        }
    }
 
    void LateUpdate(){
        //camerafollow
        if(followTarget==null)return;
        if(pixelSnapOn){
            camAnchor.position = snapMode == SnapMode.SnapToArtPixel?    RoundToArtPixelGrid(followTarget.position) : RoundToScreenPixelGrid(followTarget.position);
        }else{
      camAnchor.position = new Vector3(followTarget.position.x,followTarget.position.y,-10);
      
        }
    }
   
    private    void Zoom(float subPxFactor){
        orthoSize    = GetPixelPerfectOrthoSize(subPxFactor);  
        StartCoroutine(ZoomTransition());
    }
 
    private    IEnumerator ZoomTransition(){
        float timer = 1F;
        while(timer >0F){
            cam.orthographicSize = Mathf.Lerp(cam.orthographicSize, orthoSize, Time.deltaTime *10F);
            timer-= Time.deltaTime;      
            yield return null;
        }  
        cam.orthographicSize = orthoSize;
    }
 
    private    float GetPixelPerfectOrthoSize(float screenPixelPerSpritePixelWidth){
   
        subPixelFactor = screenPixelPerSpritePixelWidth;  
        float s = pxPerUnit *subPixelFactor;  
        snap = 1F/pxPerUnit    /subPixelFactor;
        return cam.pixelHeight / s / 2F;
    }
 
    public    static Vector3 RoundToScreenPixelGrid(Vector3 worldPos){
        float snapArt    = PixelPerfect.instance.snap;
        return new Vector3(    Mathf.Round( worldPos.x / snapArt    )    *snapArt,
                            Mathf.Round( worldPos.y / snapArt    )    *snapArt,
                            -10);
    }
 
    public    static Vector3 RoundToArtPixelGrid(Vector3 worldPos){
        float snapArt    = PixelPerfect.instance.snap * PixelPerfect.instance.subPixelFactor;
        return new Vector3(    Mathf.Round( worldPos.x / snapArt    )    *snapArt,
                            Mathf.Round( worldPos.y / snapArt    )    *snapArt,
                            -10);
    }
   
 
    public    void PixelSnapOn(bool on){
        pixelSnapOn = on;
    }
 
    public    void ToggleSnappingMode(bool art){
        if(art){
            snapMode = SnapMode.SnapToArtPixel;
        }else{
            snapMode = SnapMode.SnapToScreenPixel;
        }
    }
}

 
Y aqui la configuracion de los sprites.
 

 
(El wrap Mode lo puedes poner a tu gusto, pero el Filter Mode siempre en Point)
 
Edit:
 

 
Acuerdate de quitar Anti Aliasing en qualitySettings, para que no te joda los bordes de los pixeles! (Esto es igual lo mas importante xD)
 
Un saludo y espero que sea esto lo que buscas!
Título: Problema Con Pixel Perfect
Publicado por: pioj en Febrero 11, 2017, 12:54:51 PM
Lo que no entiendo es por qué fuerzas los Pixels Per Unity a 1
Título: Problema Con Pixel Perfect
Publicado por: lightbug en Febrero 11, 2017, 05:19:31 PM
Cita de: pioj date=1486814091Lo que no entiendo es por qué fuerzas los Pixels Per Unity a 1


Tampoco lo entiendo, eso mismo me pregunte cuando me mire algunos tutoriales de pixel perfect recientemente. Todos decian, "ahora no te manejas mas con las unidades como antes, porque 1 pixel = 1 unidad" , si es asi, chau chau pixelperfect
Título: Problema Con Pixel Perfect
Publicado por: kingtrase en Febrero 11, 2017, 06:53:10 PM
Cita de: pioj date=1486814091Lo que no entiendo es por qué fuerzas los Pixels Per Unity a 1


No es obligatorio forzar a 1, yo lo hago por gusto lo puedes poner a 100 igual.
Título: Problema Con Pixel Perfect
Publicado por: banics en Febrero 13, 2017, 02:09:43 PM
Muchisimas gracias Kingtrase, lo probare a ver si hay suerte y funciona. En cuanto al pixel per unit tengo entendido que peudes poner el que quieras (aunque la gente recomienda que sea par).
 
Gracias y un saludo.
Título: Problema Con Pixel Perfect
Publicado por: banics en Febrero 14, 2017, 09:03:22 PM
Hola buenas. He probado el script, pero seguimos teniendo el mismo problema. Creo que no me he explicado bien. Nuestro problema no reside en el pixel perfect en si (ya que simplemente es aplicar la formulita y santas pascuas), si no en que nuestro juego tiene un escenario fijo (imagina una escena llena de ladrillos, 20 ladrillos de alto por 5 de ancho), y si cambiamos de resolucion (o mas bien de aspect ratio) cambia totalmente el escenario, ya que alomejor de 20 ladrillos se nos ven 18.5 y en vez de 5 se nos ven 4. He intentado ajustarlo "a la fuerza" tanto a lo alto como anxho pero se distorsiona muxo, ese es nuestro autentico problema.
 
 
 
Un saludo y gracias de antemano.
Título: Problema Con Pixel Perfect
Publicado por: kingtrase en Febrero 14, 2017, 09:35:10 PM
tienen que ser los ladrillos fijos?, podeis poner ladrillos para la resolucion maxima, y las resoluciones mas bajas se veran menos ladrillos pero sin distorsion
Título: Problema Con Pixel Perfect
Publicado por: lightbug en Febrero 15, 2017, 01:07:49 AM
Cita de: banics date=1487102602Hola buenas. He probado el script, pero seguimos teniendo el mismo problema. Creo que no me he explicado bien. Nuestro problema no reside en el pixel perfect en si (ya que simplemente es aplicar la formulita y santas pascuas), si no en que nuestro juego tiene un escenario fijo (imagina una escena llena de ladrillos, 20 ladrillos de alto por 5 de ancho), y si cambiamos de resolucion (o mas bien de aspect ratio) cambia totalmente el escenario, ya que alomejor de 20 ladrillos se nos ven 18.5 y en vez de 5 se nos ven 4. He intentado ajustarlo "a la fuerza" tanto a lo alto como anxho pero se distorsiona muxo, ese es nuestro autentico problema.
   
   
       
   
   
      Un saludo y gracias de antemano.
   


Y si usas dos camaras para renderizar? una la usas para modificar el orthographic size como decis en el primer posteo, y la otra excusivamente para el fondo. En los celulares el aspect ratio es a la inversa que en desktop (por logica), osea que te conviene asegurarte el ancho primero, lo que podes probar (y creo que ya lo hiciste como decis arriba) es la de usar la imagen de aspect ratio fijo (cosa de que los ladrillos esten y no se distorsionen) y ancho ajustable a la pantalla,  de forma forzada con un OnGUI() por ejemplo, usar el fondo de textura y no de sprite. El problema esta en el alto claro, que aspect ratio son los mas usados en celulalres?
 
 
Título: Problema Con Pixel Perfect
Publicado por: banics en Febrero 20, 2017, 11:10:50 PM
Hola ligthbug, gracias por contestar.
 
He estado trasteando con lo que me has dicho y tengo algunas dudas.
 
La primera es, si tengo dos cámaras ,una para renderizar la capa de fondo y otra para lo demás pasan dos cosas. o que la cámara que renderiza todo se "impone" y queda el mismo resultado o le digo a la otra cámara q renderize todo menos el fondo, lo cual queda vacio.
 
Lo segundo, que diferencia hay entre ponerlo en textura o en sprite? como se colocaría en la escena? simplemente un cubo o un quad con la textura como shader?
 
Y lo ultimo y no menos importante, si "fuerzo" de cualquier manera no se distorsionara los pixeles de igual forma?
 
 
 
Gracias de antemano y un saludo.
Título: Problema Con Pixel Perfect
Publicado por: lightbug en Febrero 21, 2017, 12:05:36 AM
Cita de: banics date=1487628650La primera es, si tengo dos cámaras ,una para renderizar la capa de fondo y otra para lo demás pasan dos cosas. o que la cámara que renderiza todo se "impone" y queda el mismo resultado o le digo a la otra cámara q renderize todo menos el fondo, lo cual queda vacio.
   


tenes que tener el fondo en una layer ("fondo") y el resto fuera de esta layer. la camara encargada del fondo solo acepta la layer "fondo" y la otra camara todo menos "fondo". El orden de renderizado lo controlas con el parametro Depth, aunque nunca recuerdo cual tiene prioridad si menor o mayor, te vas a dar cuenta. La camara del fondo tiene un clear color como cualquier camara default (o skybox como quieras), la camara del resto tiene un Dont clear para que dibuje sobre lo que dibujo la anterior.
 
 
 
Cita de: banics date=1487628650Lo segundo, que diferencia hay entre ponerlo en textura o en sprite? como se colocaría en la escena? simplemente un cubo o un quad con la textura como shader?
   
   
      Y lo ultimo y no menos importante, si "fuerzo" de cualquier manera no se distorsionara los pixeles de igual forma?
   


Lo de forzarlo me referia a que por codigo generas un Rect que tenga un cierto ancho (el del dispositivo, menor dimension que el alto) y con el aspectRatio determinas el alto. Esto era para probar en distintos dispositivos y que se vea bien. En OnGUI yo cargaba Texturas para hacer esto, no se si podes usar Sprites. Tenes que ver el orden de dibujo, OnGUI creo que pisa todo el render de la camara, esta despues de OnRenderImage, asi que no se si te serviria.
Título: Problema Con Pixel Perfect
Publicado por: banics en Marzo 08, 2017, 08:05:30 PM
hola wenas, siento la tardanza.
 
He intentado lo que me has dicho, renderizar con una camara el escenario  con otra el resto, aplicando en esta ultima el criterio pixel perfect, pero el escenario se ve mal, ya que la camara que renderiza el fondo fuerza a que ocupe todo el aspec ratio.
 
Tambien he intentado dibujar la escena con OnGui, darle el ancho y el alto, pero los pixeles estan distorsionados.
 
En resumen, estoy viendo que a un pixel art le toca obligatoriamente un size de pantalla, y que si se intenta ajustar o forzar se va  a ver mal.
 
Hay un juego, tomb of the mask, en la play store. Es pixel art y se muestra siempre los mismos pixeles en cualcuier aspect ratio y/o pantalla, asi que ya no se que hacer para no tirarme de los pelos XD.