Unity3D - Shader für sprite-clipping
Ich bin versuchen, um eine shader, die verwendet werden können, um clip 2D-sprites in einem Spiel, fand ich diese shader in eine andere Frage
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
}
}
}
funktioniert perfekt auf einzelne sprites, aber ich bin mit sprite Blätter, geteilt durch die Einheit Sprite-editor.
Die _Width-variable im shader ist für das ganze sprite-Blatt, nicht den sprite, an dem ich arbeite. Ich suchte nach einem Weg, um den aktuellen sprite-rect-innen die shader konnte aber nicht alles finden.
InformationsquelleAutor Khaled Abu AlKheir | 2014-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut, nach dem ziehen meine Haare seit drei Tagen, konnte ich einen workaround finden.
Nach der Suche mehr darüber, wie Shadern arbeiten und dort Rolle in der pipeline, erkannte ich, dass der sprite-rect-info wird wahrscheinlich nicht in der shader-aus einem einfachen Grund, die Funktionalität von fast allen Shadern (außer mir) erfordert keine info, weil die Arbeit der shader ist ein Eckpunkt ist, ändern Sie seine position (wenn nötig) durch die vertex-Funktion und entscheiden Sie dann, das pixel-Farbe durch die fragment-Funktion, es kümmert sich nicht um den gesamten sprite, es muss nur nachschlagen des pixel-Farbe für einen bestimmten Eckpunkt der textur mit Ihrer textur-Koordinaten.
Ich bin sicher, dies ist trivial info für Menschen, die im Shader, aber es nahm mir Zeit, Sie zu verwirklichen ( Dies war meine erste shader).
So als workaround musste ich die shader-Eigenschaften übergeben werden, die MinX und MaxX, der aktuellen sprite die shader arbeiten, in das sprite-sheet, sodass der shader sieht nun wie folgt aus:
Verwenden diesen shader, müssen Sie ein material, das verwendet wird, verwenden Sie dann das material in der SpriteRenderer, können Sie die Füllung ändern Betrag, MinX und MaxX aus der inspector, oder rufen Sie die spriteRenderer.material.setFloat(Eigenschaft, Wert) aus dem code.
Ich nun vor ein weiteres Problem mit animierten sprites, ich hatte immer die Aktualisierung der MinX und MaxX auf jedem Bild, aber wenn ich habe es in der Update-Funktion der animation begann zu flackern, und das ist, weil das update aufgerufen wurde, nachdem der sprite gerendert wird, also musste ich die "Main Camera" OnPreRender-Ereignis zur Aktualisierung der material-Eigenschaften.
Vielleicht gibt es einen besseren Weg, all das zu erreichen, aber dieses ist das beste, ich könnte kommen mit, und ich hoffe, das wird profitieren, dass jemand versucht, den gleichen Effekt erzielen.
Gute Lösung. Es ist toll, in anderen Fällen auch, wie wenn Sie nur wollen, um clip Ihr Bild von bestimmten Bereichen. Eine Wunschliste posten, die ich möchte hinzufügen, das ist der clip von beiden Seiten. Sie können erreichen, dass mit Ihnen, mit dem minX (Erhöhung minX statt verringert) füllen, damit ' s auch schön.
InformationsquelleAutor Khaled Abu AlKheir
Habe ich verbessern Khaled-AbuA-lkheir shader hinzufügen base sprite Farbe:
InformationsquelleAutor A.Quiroga