[Résolu] Texture2D: Aspect ratio / Blend / Fade / Alpha

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

[Résolu] Texture2D: Aspect ratio / Blend / Fade / Alpha

Message par Jayme65 » 20 Avr 2017 14:40

Bonjour,

Je cherche à savoir comment régler l'aspect ration d'une texture2d sur un objet (ici, un plane)!
C'est une chose tout à fait évidente à faire avec le nouveau VideoPlayer
Image
...mais impossible de trouver comment régler cet aspect ration pour un bitmap!

Comment dois-je m'y prendre pour qu'une image de ce type
Image
s'affiche avec le bon aspect ration sur un objet carré par exemple?
(donc, PAS comme ça ;) )
Image

Merci!!
Dernière édition par Jayme65 le 05 Déc 2017 12:10, édité 3 fois.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 20 Avr 2017 15:27

Depuis l'éditeur ou en runtime?
En sprite ou sur un objet 3D?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Avr 2017 15:33

boubouk50 a écrit :Depuis l'éditeur ou en runtime?
En sprite ou sur un objet 3D?
Bonjour boubouk!

Runtime sur objet 3D !

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 20 Avr 2017 16:42

Dans ce cas, l'aspect ratio est dépendant des UVs, pas de la texture, et c'est un peu plus problématique si le placage n'est pas uniforme.
La solution se règle donc, je pense, en shader et en script.
Pour la primitive Plane d'Unity, faire comme suit:
En script, il faudrait récupérer l'aspect ratio de la texture2D du matériau (faisable avec Width et Length) puis appliquer ce ratio au scale d'UVs du matériau (aspect ratio < 1, déterminer si scale sur U ou V en fonction de l'orientation (paysage ou portrait)).
Ensuite en shader, faire en sorte que si une des coordonnées est en dehors de l'ensemble [0;1], alors rendre noir. Je ne suis pas sous Unity actuellement, mais il est possible qu'en configurant la texture en Clamp (pas de répétition) et la diffuse color à noir, alors tout ce qui est hors texture soit noir, et ainsi éviter la partie shader.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 20 Avr 2017 23:44

boubouk,

Un grand merci pour tes explications qui m'ont bien mis sur les rails!
Reste en effet une dernière chose problématique à régler: masquer les régions indésirables car comme tu vois les bords de l'images sont étirés!

Image

Alors, faut-il masquer? Si oui comment et de toute façon on verrait alors la couleur banche!
Faut-il superposer dans ces régions du noir (donc multiplier par du noir)? Si oui comment!?

Aurais-tu une idée à ce sujet?

Merci encore pour ton aide précieuse!

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class MainCameraScript : MonoBehaviour
{
    public GameObject screen;
    public Material bmp;
    // Use this for initialization
    void Start()
    {
        SetTexture("C:\\testimage.png");
    }

    void SetTexture(string path)
    {
        // Create new texture2d
        Texture2D tex = LoadPNG(path);
        if (tex == null)
        {
            return;
        }

        // Set width/height scale/offset for UV's
        float twidth = 1.0f;
        float theight = 1.0f;
        float owidth = 0.0f;
        float oheight = 0.0f;
        if (tex.width >= tex.height)
        {
            theight = (float)tex.width / tex.height; // Tiling
            oheight = oheight = (theight -1) / -2; // Offset
        }
        else
        {
            twidth = (float)tex.height / tex.width;
            owidth = (twidth -1) / -2;
        }

        // Set texture to material albedo
        bmp.mainTexture = tex;

        // Scale object UVs to fit texture
        bmp.mainTextureScale = new Vector2(twidth, theight);
        bmp.mainTextureOffset = new Vector2(owidth, oheight);
    }

    public static Texture2D LoadPNG(string filePath)
    {
        Texture2D tex = null;
        byte[] fileData;
        if (File.Exists(filePath))
        {
            fileData = File.ReadAllBytes(filePath);
            tex = new Texture2D(2, 2, TextureFormat.ARGB32, false);
            tex.filterMode = FilterMode.Point;
            tex.wrapMode = TextureWrapMode.Clamp;
            tex.LoadImage(fileData); //..this will auto-resize the texture dimensions.
        }
        return tex;
    }
}

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 21 Avr 2017 09:30

Là, ce sera fait en shader je pense.
Quel shader prends-tu? Un Legacy Unlit je suppose? Si ton plan ne doit pas réagir à la lumière alors c'est très simple.
Ton shader doit afficher seulement la couleur de ta texture si les coordonnées d'UVs sont comprises entre 0 et 1, sinon tu renvoies du noir.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 21 Avr 2017 11:37

alors c'est très simple
:)

Bon, en fait les shaders et moi ça fait 1,5 ;) !
En lisant cette page (http://metalbyexample.com/textures-and-samplers/) j'ai juste appris que cela s’appellerait 'Clamp-to-Zero Addressing' !?

Pourrais tu me donner de l'aide sur cette partie Shader?
Comment doit s'écrire cette partie du shader qui affichera seulement la couleur de ta texture si les coordonnées d'UVs est comprises entre 0 et 1 et du noir sinon?

Merci!!

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 21 Avr 2017 13:02

J'ai pas testé, je l'ai fait à partir de bouts de code que j'ai choppé sur le net. Teste voir s'il fonctionne, enregistre-le en .shader ou bien crée un nouveau shader et supprime tout à l'intérieur pour remplacer le contenu. S'il compile, tu le trouveras dans la liste des shaders sous CustomShader > Unlit Clamp-To-Zero:

Code : Tout sélectionner

Shader "CustomShader/Unlit Clamp-To-Zero" {
	Properties {
		_MainTex ("Base Texture (RGB)", 2D) = "white" {}
	}
	
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 100
		
		Cull Off
		
		CGPROGRAM
		#pragma surface surf Unlit
		#include "UnityCG.cginc"
		
		 half4 LightingUnlit (SurfaceOutput s, half3 lightDir, half atten) {
           half4 c;
           c.rgb = s.Albedo;
		   c.a = 1;
           return c;
         }
		
		sampler2D _MainTex;
		
		struct Input {
			float2 uv_MainTex;
		};
		
		void surf(Input IN, inout SurfaceOutput o) {
			fixed4 tex = tex2D(_MainTex, IN.uv_MainTex);
			fixed4 c;
			if (IN.uv_MainTex.x > 1.0 || IN.uv_MainTex.x < 0.0 || IN.uv_MainTex.y > 1.0 || IN.uv_MainTex.y < 0.0)
				c = fixed4 (0, 0, 0, 0);
			else
				c = tex;
			o.Albedo = c.rgb;
		}
		
		ENDCG
	}
	
	Fallback "Diffuse"
} 
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Jayme65
Messages : 47
Inscription : 31 Jan 2017 00:43

Re: Aspect ratio sur les texture2d

Message par Jayme65 » 21 Avr 2017 13:31

Waow!! Suuuuper!
Ca marche parfaitement! Un TOUT, TOUT grand merci à toi boubouk!!

Image

Entre parenthèse, je trouve surprenant de n'avoir pas trouvé cette information "facilement".
On parle ici de centrer une image avec un bon aspect ratio !! Ca devrait être très courant, non?

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Aspect ratio sur les texture2d

Message par boubouk50 » 21 Avr 2017 14:04

Pas tant que ça. Ici tu utilises un mesh, il te faudrait un sprite ou un élément d'UI en World Space.
Pour les éléments d'UI, tu as une option Preserve Aspect Ratio qui fait cela. C'est surement plus appropriée comme approche.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Unity le logiciel »