Jump to content
Unity Insider Forum

Wie überprüfe ich, ob eine Textur tatsächlich 2k ist oder nur hoch skaliert wurde?


Thariel

Recommended Posts

Hi

Mal eine grafische Frage :)

Hab ein Modell mit Texturen und Animationen outgesourct und jemand macht das jetzt für mich.

Die Textur soll 2048x2048 sein, das ist sie auch, aber trotzdem sieht alles matschig aus.

Ich habe den Verdacht, dass er einfach eine 1024 oder sogar 512 Textur auf 2k hochskaliert hat.

Das wäre natürlich schwachsinnig und auch eine Täuschung.

Kann ich das irgendwie herausfinden?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Herausfinden kann man es recht einfach. Wenn man eine 1024 Pixel Textur auf 2048 Pixel bringt, sieht man das recht deutlich. Die Textur wirkt unscharf, teils verwaschen. Wenn man dies von 512 aus macht sieht man den Effekt noch mehr. Es wird dabei ja nur alles vergrößert und das wird immer leicht unsauber, es sind ja keine Vectorformen wo alles neu berechnet wird. Man kann diese Unschärfe Effekte zwar eindämmen in dem man je nach Anwendungsfall Bikubisch oder Billinear verwendet und Filter über das Bild legt, aber ein Verlust hat man bei Vergrößerungen immer.

Hier mal mein Avatar als Beispiel, Original 150 x 150 Pixel, verdoppelt auf 300 x 300 Pixel, vervierfacht auf 600 x 600.

Wäre nichts anderes wie 512 x 512 Pixel zu 1024 x 1024 Pixel, zu 2048 x 2048 Pixel.

6baee9-1521185184.jpg

Man sieht recht deutlich den Verlust der Qualität. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn man eine Textur hochskaliert, dann wird sie "pixelig". Um das zu Verdecken, kann man nach dem Hochskalieren ein "Blurring" auf die Textur ausführen, dieses verwischt die entstandenen Pixel wieder, macht die Textur dann aber "unscharf"...

Das Ganze kann auch durch eine fehlerhafte Bedienung im Grafikprogramm passieren, wenn man hier eine Textur skaliert ohne daß das Grafikprogramm auf die Originaltextur zugreift, dann skaliert sie eine (verkleinerte) Kopie der Originaltextur ....

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ist die Textur matschig oder sieht es nur in Unity so aus?
Das kannst du ganz leicht überprüfen, wenn du dir die Textur in einem Grafikprogramm auschaust, denn dort sollten schon scharfe Pixel zu sehen sein.
Wenn sie da scharf aussieht, dann liegt es an deinen Importeinstellungen ür die Textur und/oder den Rendereinstellungen.
Ist der Haken Generate Mip Maps an, wird die Textur weicher, wenn sie nicht ganz nah an der Kamera ist.
Der FilterMode sollte auf Point gestellt werden, wenn du es ganz scharf haben willst. Alle anderen Modi mache die Textur weicher.
Bei den Importsettings kannst du schauen, ob deine Zielgröße auch groß genug ist. Du kannst hier für jedes Exportsystem einstellen, ob die Textur evtl. auf das eingestellte Maximalmaß verkleinert werden würde.
Ja und dann gibt es noch das Format in dem die Textur beim Import konvertiert wird. Da ist ein Kompressor voreingestellt. Den kannst du z.B. auf RGB24Bit stellen. Dann kommt die Textur genau so zur Geltung, wie du sie im Grafikprogramm sehen würdest. Aber dann braucht die Textur in deinem Projekt auch viel mehr Ram als evtl. nötig wäre.

 

import.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antworten. Leider ist es ziemlich schwierig zu beurteilen, ob es vergrössert wurde, weil es ist ja kein normales Bild, sondern eine Textur. Das Model ist eine Tierfalle und besteht hauptsächlich aus Ästen und Zweige... also runde Objekte, so ist eh irgendwie alles verzerrt.

@malzbie Hab es ausprobiert und es stimmt schon was du sagst. Aber bei Point sieht man dafür aus der Nähe jedes einzelne Pixel, da hab ich es lieber etwas verschwommen :)

Hier mal aus Ausschnitt aus der Textur bei 100% Skalierung in Photoshop:

falletextur.jpg.ddcf26e0292527e9e2b8b9b70c300f78.jpg

 

Und so sieht die Textur in Unity aus. Ich finde es viel zu matschig für eine 2k Textur. Was meint ihr?

falleobjekt.thumb.jpg.d3958b83b1839343cbf73ec08fcbc72f.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Der hat natürlich auch ziemlich viele Baumstämme in eine Textur gepackt und dann auch noch einen recht breiten "Bleeding"-Rand. In solchen Fällen wäre es besser man nimmt eine Textur für den Stamm und eine 2. Textur für die Detailmap (+ Detailmaske). Damit kann man für den Baumstamm die vollen 1k oder 2k Auflösung fahren.
Hier teilen sich ja scheinbar 16 oder 17 Stämme eine 2k Textur was effektiv einer Textur von "120 x 2048" Pixel pro Stamm entspricht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ich mir den Ausschnitt der Textur anschaue, dann wird das schon ne 2048 Textur sein. Jedenfalls gewisse Bereiche.
Wo er aber die Rohgrafik her hat und was für ne Auflösung diese hatte, kann ich nicht sagen.
Jedenfalls sollte das Ergebnis etwas besser werden, wenn du die Kompression ausschaltest. Gerade bei nahen Farben, kann DTX1 zu Fehlern führen und alles matschig werden lassen. Stell also testweise mal auf RGB24 Bit um.
@Zer0Cool hat schon Recht. Da sich zu viele Stämme die Textur teilen, ist echt nicht mehr viel für jeden einzelnen Stamm übrig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Falle ist für kleinere Tiere wie Krabben, Hasen und Frösche. Mir geht es auch darum, dass ich nicht verarscht werde... da musst du nämlich höllisch aufpassen bei Freelancern.  Habe ihm gesagt, er solle mir noch eine 4k Textur generieren, falls es eine Substanz ist und er hat das dann auch gemacht. Jetzt sieht ihr den Unterschied zwischen 2k und 4k. Bin jetzt ziemlich zufrieden.

falle-2k.thumb.jpg.4c80e90ca57dfb3e7111dc1331443011.jpg

falle-4k.thumb.jpg.35006528122102faf3761e462245bc70.jpg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Vier mal soviel Info in einem Bild ist natürlich viel besser. Sieht von der Textur her schon schick aus.

Du solltest aber evtl. doch mal dein Konzept überdenken, denn 4k Texturen, nur für ein paar Holzstämme, sind schon ein Wort. Und wenn du, und davon gehe ich aus, eine Art Survival Game machst, dann wirst du noch sehr viele Texturen brauchen!
Ich finde das Verhältnis von Texturauflösung zur Polygonzahl auch nicht so gut. Denn du hast da lediglich 8-Eckige Stämme für ein Closeup mit ner hypermega 4k Textur.
Verstehst du was ich meine?
8Eckige Stämme sind was für hintere LOD-Bereiche. So nah, können es ruhig doppelt so viele Flächen sein.
Für die Stämme hätte auch eine einzige kachelbare Textur gereicht, die ohne weiteres mit 2K ausgekommen wäre. Denn wenn du einzelne Stämme etwas drehst, schaust du immer auf nen anderen Texturbereich und alle sehen anders aus. Außerdem kann man bei einer kachelbaren Textur einfach für jeden Stamm die UV Positionen etwas verändern und somit noch mehr Varianz rein bringen. 
Versteh das als Ratschlag, nicht als Kritik, :) denn du wirst noch mächtig viele Daten erzeugen, die auch alle in die Grafikkarte geladen werden wollen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@malzbie
Bin jetzt kein Artist, daher die Nachfrage, bei diesen Stämmen müsste man dann für kachelbare Texturen 2 Materialien erzeugen, ein Material für die Rinde und ein Material fürs geschnittene blanke Holz oder? Man hat zwar den kleinen Nachteil, daß das Objekt dann mit 2 Drawcalls gerendert werden muss, spart aber eine Menge Texturspeicher. Meine Vermutung wäre, wenn man hier 2 "tilebare" Materialien verwendet reicht eine 1k Textur für die Rinde und eine 0.5k Textur für die geschnittenen Flächen.   

Zu den anderen Anregungen von malzbie, wenn man schon jemanden mit einem Modell beauftragt, dann kann man auch erwarten, daß er einem 3 LOD-Stufen erzeugt für dieses Objekt. Damit hätte das Modell in der Nähe mehr Faces als in der Entfernung, welches a ) die Qualität verbessert und b ) der Performance gut tut.

Man könnte das ganze auch mit einem Drawcall erledigen, dafür müsste man allerdings (wie ich oben schon geschrieben hatte) eine Detailtextur bzw. 2 Detailstexturen verwenden und einen entsprechenden Shader. Der Unitystandardshader kann allerdings nur eine Detailstextur verarbeiten, für obiges Modell bräuchtest du allerdings 2 Detailstexturen. Kenne mich damit aktuell gut aus, da ich vor kurzem einen Overlayshader geschrieben haben, der eben mehrere Detailstexturen rendert...

Das Setting sehe dann wie folgt aus:
- 1 Maintextur (kann man weglassen)
- 1 Detailmaske für die Rinde (0.5k)
- 1 Detailmaske fürs Holz (kann man sich auch einsparen, wenn der Shader die Negativmaske von oben nimmt)
- 1 Overlaytextur Holz (1k)
- 1 Overlaytextur Rinde (1k)

Macht in Summe 2.5k Texturen. Erzeugt halt einiges an Mehraufwand, aber das ist bei Optimierungen immer so ^^
Diese Methode erzeugt im Nahbereich extrem gute Texturauflösungen besser als die Methode mit der 4k-Textur, ist also für Objekte die später im Spiel nur sehr klein sind nicht zu empfehlen bzw. zu aufwendig.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Zer0Cool

Man kann sicherlich jetzt 2 Texturen für Stamm uns Stammenden nutzen, aber ich meite das eher so:
stamm.thumb.JPG.992d0beaa2a895bcb03459556cc4fce1.JPG

Das ist jetzt übrigens eine 2048er Textur. Hab sie zwar in Cinema gerendert, aber für das Zeigen, welche Qualität dabei raus kommt, ist es ja egal wo es gerendert ist. Pixel ist Pixel.

Und das Verschieben der UV Koordinate für einen anderen Stamm würde dann z.B.so aussehen:

verschoben.JPG.a7305a4d02b552ec648bf250045eeac2.JPG

Eine kachelbare Textur muss ja nicht über das ganze Sheet gehen. In meinem Beispiel ist die Textur genauso kachelbar. Seitlich kann und muss aber nicht verschoben werden, da ja der Stamm einfach gedreht werden kann.

Dein Textur-Vorschlag ist natürlich schon die "Grand Dame" ! Soweit wollte ich gar nicht gehen. :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 8 Stunden schrieb malzbie:

Ich finde das Verhältnis von Texturauflösung zur Polygonzahl auch nicht so gut. Denn du hast da lediglich 8-Eckige Stämme für ein Closeup mit ner hypermega 4k Textur.
Verstehst du was ich meine?

Das sind ja Äste, und keine Stämme ;) Das sind Ecken mehr als genug.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Interessante Technik ;)
Wenn der Modellierer oben die kompletten Faces eines Stammes in der Breite auf eine 128 (oder kleiner mit Seamborder) Pixel-Textur gemappt (2048 / (16 + Seamborder)) hat wundert mich die schlechte Auflösung nicht. Wäre mal interessant, wie das UV-Mapping deines Modells aussieht...

Link zu diesem Kommentar
Auf anderen Seiten teilen

@runner78

Ob es nur Äste oder Stämme sind ist egal. Kommt man mit der Kamera nah ran, sind es für meine Augen und die heutige Zeit zu wenig Poygone am Rand.

@Zer0Cool

Ja, das ist nichts anderes als ein Tiling und man braucht dadurch natürlich 2 Meshes die jeweils das gleiche Material haben können. Ein Mesh dieser Art kostet aber nicht viel Speicher, von daher ist das ne brauchbare Alternative um Texturplatz zu sparen, denn die Enden sind ja mit auf dieser textur drauf. Ist sogar noch Platz für 2 weitere Enden.
 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hier mal ein Shader mit welchem man indirekt die "UV-Mapping Qualität" "messen" kann. Einfach ein Material erstellen, diesen Shader zuweisen ("Custom / showUVs") und dem Mesh zuwesien. Wenn die roten / grünen und gelben Bereiche möglichst breit (Gleichverteilung) über den Mesh verteilt sind, dann hat das UV-Mapping die Bereiche der Material-Textur gut ausgenutzt. Wenn man allerdings überall die gleiche Farbe sieht (nur gelb), dann würde ich später auch Probleme mit der Auflösung erwarten...

PS:
Mit diesem Shader kann man sich auch die UV1 "anschauen", dies ist die UV welches beim Import für den Lightmapper erstellt wird...

// Einfacher "UV-Shader" by Zer0Cool aka Zer0f0rce
Shader "Custom/showUVs" {
	Properties {
		[Toggle(UVSET)] 
	    _UVSet("Show UV0", Float) = 1
		[HideInInspector]_MainTex("Albedo (RGB)", 2D) = "white" {}
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		//Cull off

		CGPROGRAM
        #pragma shader_feature UVSET
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
#ifdef UVSET
			float2 uv_MainTex;
#else
			float2 uv2_MainTex;
#endif
		};

		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) {
#ifdef UVSET
			o.Albedo = float3(IN.uv_MainTex.rg, 0);
			o.Emission = float3(IN.uv_MainTex.rg, 0);
#else
			o.Albedo = float3(IN.uv2_MainTex.rg, 0);
			o.Emission = float3(IN.uv2_MainTex.rg, 0);
#endif			
			o.Alpha = 1;
		}
		ENDCG
	}
	FallBack "Diffuse"
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...