[Résolu] Texture2D: Aspect ratio / Blend / Fade / Alpha
[Résolu] Texture2D: Aspect ratio / Blend / Fade / Alpha
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
...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
s'affiche avec le bon aspect ration sur un objet carré par exemple?
(donc, PAS comme ça )
Merci!!
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
...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
s'affiche avec le bon aspect ration sur un objet carré par exemple?
(donc, PAS comme ça )
Merci!!
Dernière édition par Jayme65 le 05 Déc 2017 12:10, édité 3 fois.
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Aspect ratio sur les texture2d
Depuis l'éditeur ou en runtime?
En sprite ou sur un objet 3D?
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Aspect ratio sur les texture2d
Bonjour boubouk!boubouk50 a écrit :Depuis l'éditeur ou en runtime?
En sprite ou sur un objet 3D?
Runtime sur objet 3D !
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Aspect ratio sur les texture2d
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Aspect ratio sur les texture2d
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!
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!
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!
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;
}
}
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Aspect ratio sur les texture2d
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Aspect ratio sur les texture2d
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!!
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Aspect ratio sur les texture2d
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation
Re: Aspect ratio sur les texture2d
Waow!! Suuuuper!
Ca marche parfaitement! Un TOUT, TOUT grand merci à toi boubouk!!
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?
Ca marche parfaitement! Un TOUT, TOUT grand merci à toi boubouk!!
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?
- boubouk50
- ModoGenereux
- Messages : 6225
- Inscription : 28 Avr 2014 11:57
- Localisation : Saint-Didier-en-Bresse (71)
Re: Aspect ratio sur les texture2d
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.
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
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation