Jump to content
Unity Insider Forum

2D Sprite korrekt verzerren?


minuschki

Recommended Posts

Hallo zusammen

Ich möchte gerne im 2D Modus ein Bild mit der Maus verzerren! Dazu habe ich bei den 4 Ecken Anfasser positioniert, welche sich mit der Maus verschieben lassen. Das Bild ist als Material einem Quad zugewiesen, welches ja bekanntlich aus 2 Triangles besteht. Und hier ergibt sich auch schon das Problem! Zieht man an der linken, oberen Ecke, wird das Bild zwar verzerrt, aber eben nur die linke, obere Hälfte. Das Dreieck unten, rechts bleibt unverändert und es entstehen Knicke im Muster. Im hochgeladenen Bild könnt ihr den Effekt sehen.

Frage: Gibt es eine Möglichkeit im 2D Modus, ein 2D-Sprite korrekt zu verzerren, so wie das z.B. in Photoshop der Fall ist? Mit Quad klappt das ja offensichtlich nicht.

Danke für eure Hilfestellung!

 

Musterknick.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Du möchtest ein Rechteck auf einem Trapez abbilden, dafür benötigt man etwas Mathemagie im Shader.
Ich bin aktuell nicht stark genug in diesen Thematiken eingearbeitet, daher lasse ich nur mal Begriffe und Links fallen, die dir vielleicht weiterhelfen:
Quadrilateral Interpolation  / Projective Interpolation

https://www.reedbeta.com/blog/quadrilateral-interpolation-part-1

https://gamedev.stackexchange.com/questions/148082/how-can-i-fix-zig-zagging-uv-mapping-artifacts-on-a-generated-mesh-that-tapers/176352#176352

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich danke SkipToPlay für die Antwort!

Höchstwahrscheinlich überfordern deine gutgemeinten Links meine Programmierfähigkeiten, da ich mich in der Shader-Welt überhaupt nicht auskenne. Immerhin habe ich teilweise verstanden, wie das Problem gelöst werden könnte. Und der Aufwand, die handvoll Codezeilen in einen bestehenden Shader einzufügen, ist für einen versierten Kenner der Materie bestimmt ein Klacks. Ich hingegen verstehe nur Bahnhof. Also werde ich mal in den unendlichen Weiten des Internets nach so einem Shader suchen.

Toll und nett wäre natürlich auch, wenn jemand von euch einen solchen herumliegen hat und ihn hier posten könnte!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe noch nicht aufgegeben und mal versucht, die Anleitung unter https://gamedev.stackexchange.com/questions/148082/how-can-i-fix-zig-zagging-uv-mapping-artifacts-on-a-generated-mesh-that-tapers/176352#176352 zu befolgen. Der abgänderte Shader gibt zwar keine Fehlermeldung aus, bringt aber auch nicht den gewünschten Effekt (siehe Bild). Der Knick entlang der Triangles ist nach wie vor vorhanden.

Könnte mal jemand einen Blick draufwerfen, wo da der Wurm drin ist?

Zur Erinnerung: Der Shader sollte im 2D Modus die Textur auf einem Quad durch das Verschieben der Eckpunkte korrekt verzerren.

 

Shader "Unlit/Projektion"
{
	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
	}
	SubShader
	{
		Tags { "RenderType"="Opaque" }
		LOD 100

		Pass
		{
			CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag

			#include "UnityCG.cginc"

			struct appdata
			{
				float4 vertex : POSITION;
	//			float2 uv : TEXCOORD0;					// diese Zeile wurde deaktiviert
				float3 uv : TEXCOORD0;					// und durch diese Zeile ersetzt
			};

			struct v2f
			{
	//			float2 uv : TEXCOORD0;					// diese Zeile wurde deaktiviert
				float3 uv : TEXCOORD0;					// und durch diese Zeile ersetzt
				float4 vertex : SV_POSITION;
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata v)
			{
				v2f o;
				o.vertex = UnityObjectToClipPos(v.vertex);
	//			o.uv = TRANSFORM_TEX(v.uv, _MainTex);			// diese Zeile wurde deaktiviert
				o.uv = v.uv;						// und durch diese Zeile ersetzt
	//			o.uv.xy = o.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw;	// momentan deaktiviert. braucht es die?
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				float2 uv = i.uv.xy / i.uv.z; 				// diese Zeile wurde eingefügt

				// sample the texture
				fixed4 col = tex2D(_MainTex, i.uv);
				return col;
			}
			ENDCG
		}
	}
}

 

Kubus.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...