Unity3D - Shader pour le sprite de détourage
Je suis en train de créer un shader qui peut être utilisé pour clip sprites 2D dans un jeu, j'ai trouvé ce shader en une autre question
Shader "Sprites/ClipArea"
{
Properties
{
_MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
_Length ("Length", Range(0.0, 1.0)) = 1.0
_Width ("Width", Range(0.0, 1.0)) = 0.5
}
SubShader
{
LOD 200
Tags
{
"Queue" = "Transparent"
"IgnoreProjector" = "True"
"RenderType" = "Transparent"
}
Pass
{
Cull Off
Lighting Off
ZWrite Off
Offset -1, -1
Fog { Mode Off }
ColorMask RGB
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _MainTex_ST;
float _Length;
float _Width;
struct appdata_t
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f
{
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
return o;
}
half4 frag (v2f IN) : COLOR
{
if ((IN.texcoord.x<0) || (IN.texcoord.x>_Width) || (IN.texcoord.y<0) || (IN.texcoord.y>_Length))
{
half4 colorTransparent = half4(0,0,0,0) ;
return colorTransparent ;
}
return tex2D(_MainTex, IN.texcoord);
}
ENDCG
}
}
}
qui fonctionne parfaitement sur des sprites, mais je suis à l'aide de feuilles sprite, divisée par l'Unité éditeur de Sprite.
La _Width variable dans le shader couvre l'ensemble de la feuille sprite, pas le sprite je suis en train de travailler sur. J'ai cherché un moyen d'obtenir le sprite courant rect à l'intérieur du shader, mais ne pouvait pas trouver quoi que ce soit.
OriginalL'auteur Khaled Abu AlKheir | 2014-04-19
Vous devez vous connecter pour publier un commentaire.
Bien, après avoir tiré mes cheveux pendant trois jours, j'ai réussi à trouver une solution de contournement.
Après une recherche plus sur la façon dont les shaders travail et le rôle dans le pipeline, j'ai réalisé que le sprite rect info sera probablement pas disponible dans le shader pour une raison simple, la fonctionnalité de presque tous les shaders (sauf la mienne) n'a pas besoin de cette info, parce que le travail du shader est de prendre un sommet, de modifier sa position (si besoin) à travers le sommet de la fonction et ensuite décider de son pixel de couleur à travers le fragment de la fonction, il ne se soucie pas de l'ensemble du sprite, il a seulement besoin de la recherche de l'pixel de couleur pour un certain sommet de la texture à l'aide de ses coordonnées de texture.
Je suis sûr que c'est trivial info pour les gens qui travaillent dans les shaders, mais il m'a fallu de temps pour le réaliser ( C'était mon premier shader).
Donc comme une solution de contournement, j'ai dû utiliser le shader propriétés de passer le MinX et MaxX de l'actuel sprite, le shader est de travailler sur la feuille sprite, de sorte que le shader ressemble maintenant à ceci:
À utiliser ce shader, vous avez besoin de créer un matériau qui l'utilise, puis utiliser ce matériel dans le SpriteRenderer, vous pouvez modifier la quantité de Remplissage, MinX , et MaxX de l'inspecteur, ou appeler le spriteRenderer.matériau de.setFloat(propriété, valeur) à partir du code.
J'ai ensuite confrontée à un autre problème avec les sprites animés, j'ai dû garder la mise à jour de la MinX et MaxX sur chaque image, mais quand je l'ai fait dans la fonction de mise à Jour de l'animation a commencé le scintillement, et c'est parce que la mise à jour a été appelé après le sprite est rendu, je devais utiliser l'Appareil photo Principal OnPreRender événement pour mettre à jour les propriétés du matériau.
Peut-être qu'il est un meilleur moyen pour obtenir tout cela, mais c'est le mieux que je pouvais venir avec, et j'espère que cela profitera à quelqu'un qui essaie d'obtenir le même effet.
La bonne solution. C'est génial pour les autres cas, aussi, comme si vous ne souhaitez que clip votre image de certaines zones. Une wishlist produit que j'aimerais ajouter à cela, le clip de chaque côté. Vous pouvez accomplir cela avec le vôtre à l'aide de la minX (augmentation minX, au lieu de diminuer de remplissage), donc c'est agréable aussi.
OriginalL'auteur Khaled Abu AlKheir
J'ai améliorer Khaled-AbuA-lkheir shader l'ajout de la base de sprite couleur:
OriginalL'auteur A.Quiroga