Auf zweites UV-Set zugreifen

Spieleentwicklung mit Autorensystemen und Toolkits - Will man Spiele entwicklen, ist es oft sinnvoll nicht erst seine eigene Engine zu entwickeln, sondern gleich mit einem ausgefeilten Autorensystem zu beginnen.
Forumsregeln
Bitte nur zu Engines und Toolkits posten, die auch eine eigene Entwicklungsumgebung anbieten. Zu Engines, die nur programmatisch angesprochen werden können, bitte hier posten.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Auf zweites UV-Set zugreifen

Beitrag von starcow »

Hallo Zusammen

Ich habe folgendes Problem mit einem Unity5-Shader Script.
Ich versuche, leider ohne Erfolg, mittels eines Custom-Shader auf das zweite UV-Set meines COLLADA Modelles zuzugreifen.

Code: Alles auswählen

Shader "Custom/level-01_shader_default"
{
	Properties
	{
		_Color("Color", Color) = (1,1,1,1)
		_MainTex("Albedo (RGB)", 2D) = "white" {}
		_Glossiness("Smoothness", Range(0,1)) = 0.5
		_Metallic("Metallic", Range(0,1)) = 0.0
	}
	
	SubShader
	{
		Tags{ "RenderType" = "Opaque" }
		LOD 200

		CGPROGRAM
		// 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
		{
			float2 uv2_MainTex;
		};

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		void surf(Input IN, inout SurfaceOutputStandard o)
		{
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D(_MainTex, IN.uv2_MainTex) * _Color;
			o.Albedo = c.rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		
		ENDCG
	}
	
	FallBack "Diffuse"
}
Der Shader funktioniert insofern, das einfach das "Main-UV-Layout" der verschiedenen Modelle benutzt wird.
Egal wie ich an der Variable float2 uv2_MainTex rumschraube, das Resultat bleibt immer das selbe.

Ehrlicherweise muss ich sagen, das ich nicht verstehe inwiefern der genaue Variable-Name uv2_MainTex eine Relevanz haben kann.
Wenn ich diesen im struct, und in der entsprechenden Zuweisung anpasse, müsste es ja eigentlich egal sein wie die Variable heisst.
Dem Ist aber anscheinend nicht so :mrgreen: .

Gruss starcow

Edit:
Dieses Thema sollte eigentlich in "Autorensysteme" gestartet werden. Entschuldigung.
Falls das ein Admin verschieben könnte wäre das super!

Edit:
Ich stelle grad fest, dass hier etwas ganz grundlegendes nicht stimmen kann.
Selbst mit einem standard Material scheint die UV interpretation fehlerhaft zu sein.
Ich kann mir darauf keinen Reim machen. Als das Modell noch ein UV Set hatte, wurde dieses korrekt dargestellt.

Bild
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Auf zweites UV-Set zugreifen

Beitrag von starcow »

Ich habe das Bild nochmals aktualisiert, damit man sieht wie das ganze eigentlich aussehen müsste.

Bild

Vielleicht findet ja nun jemand von euch eine Erklärung was da schief läuft.

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Auf zweites UV-Set zugreifen

Beitrag von starcow »

Es scheint tatsächlich ein Bug in Unity zu sein.
Ich hab das ganze Szenario mal auf einen einfachen kubischen Raum runtergebrochen. Der Fehler lässt sich auch damit reproduzieren.
Falls es jemand interessieren sollte:
Hier ist das COLLADA File in Klartext.

Code: Alles auswählen

<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
	<asset>
		<contributor>
			<authoring_tool>Autodesk Softimage version 8.0.249.0 - Crosswalk 4.1</authoring_tool>
		</contributor>
		<created>2016-06-29T09:15:47Z</created>
		<modified>2016-06-29T09:15:47Z</modified>
		<revision>1.4.1</revision>
		<unit meter="0.1" name="decimetre"></unit>
		<up_axis>Y_UP</up_axis>
	</asset>
	<library_geometries>
		<geometry id="geometries_0" name="geometries_0">
			<mesh>
				<source id="geometries_0-Pos">
					<float_array id="geometries_0-Pos-array" count="24">
						-4.000000 -4.000000 -4.000000 
						4.000000 -4.000000 -4.000000 
						-4.000000 4.000000 -4.000000 
						4.000000 4.000000 -4.000000 
						-4.000000 -4.000000 4.000000 
						4.000000 -4.000000 4.000000 
						-4.000000 4.000000 4.000000 
						4.000000 4.000000 4.000000
					</float_array>
					<technique_common>
						<accessor source="#geometries_0-Pos-array" count="8" stride="3">
							<param name="X" type="float"/>
							<param name="Y" type="float"/>
							<param name="Z" type="float"/>
						</accessor>
					</technique_common>
				</source>
				<source id="geometries_0-User_Normal_Property">
					<float_array id="geometries_0-User_Normal_Property-array" count="72">
						0.000000 0.000000 1.000000 
						0.000000 0.000000 1.000000 
						0.000000 0.000000 1.000000 
						0.000000 0.000000 1.000000 
						0.000000 1.000000 0.000000 
						0.000000 1.000000 0.000000 
						0.000000 1.000000 0.000000 
						0.000000 1.000000 0.000000 
						1.000000 0.000000 0.000000 
						1.000000 0.000000 0.000000 
						1.000000 0.000000 0.000000 
						1.000000 0.000000 0.000000 
						-1.000000 0.000000 0.000000 
						-1.000000 0.000000 0.000000 
						-1.000000 0.000000 0.000000 
						-1.000000 0.000000 0.000000 
						0.000000 -1.000000 0.000000 
						0.000000 -1.000000 0.000000 
						0.000000 -1.000000 0.000000 
						0.000000 -1.000000 0.000000 
						0.000000 0.000000 -1.000000 
						0.000000 0.000000 -1.000000 
						0.000000 0.000000 -1.000000 
						0.000000 0.000000 -1.000000
					</float_array>
					<technique_common>
						<accessor source="#geometries_0-User_Normal_Property-array" count="24" stride="3">
							<param name="X" type="float"/>
							<param name="Y" type="float"/>
							<param name="Z" type="float"/>
						</accessor>
					</technique_common>
				</source>
				<source id="geometries_0-Texture_Projection">
					<float_array id="geometries_0-Texture_Projection-array" count="48">
						0.250000 0.250000 
						0.250000 0.500000 
						0.500000 0.500000 
						0.500000 0.250000 
						0.250000 0.250000 
						0.500000 0.250000 
						0.500000 0.000000 
						0.250000 0.000000 
						0.250000 0.250000 
						-0.000000 0.250000 
						-0.000000 0.500000 
						0.250000 0.500000 
						0.500000 0.250000 
						0.500000 0.500000 
						0.750000 0.500000 
						0.750000 0.250000 
						0.250000 0.500000 
						0.250000 0.750000 
						0.500000 0.750000 
						0.500000 0.500000 
						1.000000 0.250000 
						0.750000 0.250000 
						0.750000 0.500000 
						1.000000 0.500000
					</float_array>
					<technique_common>
						<accessor source="#geometries_0-Texture_Projection-array" count="24" stride="2">
							<param name="S" type="float"/>
							<param name="T" type="float"/>
						</accessor>
					</technique_common>
				</source>
				<source id="geometries_0-Texture_Projection2">
					<float_array id="geometries_0-Texture_Projection2-array" count="48">
						0.062500 0.062500 
						0.062500 0.125000 
						0.125000 0.125000 
						0.125000 0.062500 
						0.062500 0.062500 
						0.125000 0.062500 
						0.125000 0.000000 
						0.062500 0.000000 
						0.062500 0.062500 
						0.000000 0.062500 
						0.000000 0.125000 
						0.062500 0.125000 
						0.125000 0.062500 
						0.125000 0.125000 
						0.187500 0.125000 
						0.187500 0.062500 
						0.062500 0.125000 
						0.062500 0.187500 
						0.125000 0.187500 
						0.125000 0.125000 
						0.250000 0.062500 
						0.187500 0.062500 
						0.187500 0.125000 
						0.250000 0.125000
					</float_array>
					<technique_common>
						<accessor source="#geometries_0-Texture_Projection2-array" count="24" stride="2">
							<param name="S" type="float"/>
							<param name="T" type="float"/>
						</accessor>
					</technique_common>
				</source>
				<vertices id="geometries_0-Vtx">
					<input semantic="POSITION" source="#geometries_0-Pos"/>
				</vertices>
				<polylist count="6" material="Scene_Material">
					<input semantic="VERTEX" source="#geometries_0-Vtx" offset="0"/>
					<input semantic="NORMAL" source="#geometries_0-User_Normal_Property" offset="1"/>
					<input semantic="TEXCOORD" source="#geometries_0-Texture_Projection" offset="2"/>
					<input semantic="TEXCOORD" source="#geometries_0-Texture_Projection2" offset="3"/>
					<vcount>
						4 4 4 4 
						4 4
					</vcount>
					<p>
						1 3 3 3 
						3 2 2 2 
						2 1 1 1 
						0 0 0 0 
						4 7 7 7 
						5 6 6 6 
						1 5 5 5 
						0 4 4 4 
						2 11 11 11 
						6 10 10 10 
						4 9 9 9 
						0 8 8 8 
						5 15 15 15 
						7 14 14 14 
						3 13 13 13 
						1 12 12 12 
						3 19 19 19 
						7 18 18 18 
						6 17 17 17 
						2 16 16 16 
						6 23 23 23 
						7 22 22 22 
						5 21 21 21 
						4 20 20 20
					</p>
				</polylist>
			</mesh>
		</geometry>
	</library_geometries>
	<library_visual_scenes>
		<visual_scene id="visual_scenes_0" name="visual_scenes_0">
			<node id="cube" name="cube">
				<translate sid="translation">0.000000 0.000000 0.000000</translate>
				<rotate sid="rotation_z">0.000000 0.000000 1.000000 0.000000</rotate>
				<rotate sid="rotation_y">0.000000 1.000000 0.000000 0.000000</rotate>
				<rotate sid="rotation_x">1.000000 0.000000 0.000000 0.000000</rotate>
				<scale sid="scale">1.000000 1.000000 1.000000</scale>
				<instance_geometry url="#geometries_0">
					<bind_material>
						<technique_common>
							<instance_material symbol="Scene_Material" target="#Scene_Material"></instance_material>
						</technique_common>
					</bind_material>
				</instance_geometry>
			</node>
		</visual_scene>
	</library_visual_scenes>
	<scene>
		<instance_visual_scene url="#visual_scenes_0"/>
	</scene>
</COLLADA>
Mich ärgert das ganze. Ich hatte damals 2011 einen OBJ-File-Import Bug reported, bei welchem die Vertices-Normalen konsequent und reproduzierbar mit falschen Werten importiert wurden. Das Fehlverhalten zeigte sich dabei bei simpelsten Klartext-Obj-Dateien.
Ich staunte nicht schlecht, da ich mir nicht so recht vorstellen konnte, dass ich der erste sein sollte, der ein OBJ-File in diese Software importiert und daraufhin die Vertices-Normalen kontrolliert.
Jetzt offenbar nochmals eine ähnliche Geschichte mit Objekten, die zwei UV-Layouts besitzen.
Ich kann nicht nachvollziehen, wie eine so hoch entwickelte Software die grundlegendsten und trivialsten Dinge nicht richtig hin bekommt.
Aber vielleicht ist die Grösse und Komplexität dieser Engine genau der Grund dafür.
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Tiles

Re: Auf zweites UV-Set zugreifen

Beitrag von Tiles »

Du könntest es zwar als Bug melden. Und ich würde das auch empfehlen. Viel Hoffnung auf ein Fix würde ich mir allerdings nicht machen. Ist halt so bei Unity. Bugs werden zu gern ignoriert. Das ist ne Lotterie ob das behoben wird oder nicht. Weil das kostet ja Manpower, und somit Geld. Das sieht man auch sehr schön daran dass sie da einen Quiz aus der Buggeschichte gemacht haben. Wer ein Fix will muss Votes sammeln. Und selbst dann gibts noch keine Garantie dass der Bug dann behoben wird ...

Der Obj Importer hat mehr als diese eine Macke. Das Ding scheitert zum Beispiel schon an einem zweiten Material. Aber am Collada und Obj Im- und Exporter werden sie eh nie was fixen, denn das wird offiziell gar nicht mehr unterstützt. Offizielles Format ist FBX.
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Auf zweites UV-Set zugreifen

Beitrag von starcow »

Danke für die Auskunft Tiles.
Wäre COLLADA nicht das offene Format gegenüber FBX, bei welchem Autodesk bestimmt?
Deine Schilderungen machen mir die Unity Engine jetzt nicht grad sympathischer.
Gibts eigentlich keine kleine ZFX Engine? :mrgreen:

Gruss starcow
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Dummie
Beiträge: 97
Registriert: 09.02.2004, 20:45

Re: Auf zweites UV-Set zugreifen

Beitrag von Dummie »

Man kann bei Unity bei den Import-Optionen der Models einstellen, dass die UV-Maps invertiert werden. Keine Ahnung, ob das bei deinem Problem hilft, aber du kannst es ja mal probieren.

Alternativ kannst du dir auch die Unreal Engine anschauen. Eine eigene Engine zu schreiben ist allerdings keine Option. Im Notfall musst du dir einfach andere Wege suchen. Heutzutage ist man von der Toolchain leider ziemlich abhängig.
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Auf zweites UV-Set zugreifen

Beitrag von starcow »

Dummie hat geschrieben:Man kann bei Unity bei den Import-Optionen der Models einstellen, dass die UV-Maps invertiert werden. Keine Ahnung, ob das bei deinem Problem hilft, aber du kannst es ja mal probieren.
Danke für den Tipp! Geholfen hat es leider nichts.

Gruss und Danke :)
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Tiles

Re: Auf zweites UV-Set zugreifen

Beitrag von Tiles »

starcow hat geschrieben: Wäre COLLADA nicht das offene Format gegenüber FBX, bei welchem Autodesk bestimmt?
Jo. Aber Collada ist auch gleich das Format bei dem deutlich weniger Entwicklung herrscht. Bei proprietären Sachen herrscht eben ein ganz anderer Marktdruck :)
Antworten