Seite 1 von 1

(erledigt)[DX9,C++]D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 19:05
von Droven
Hi an die Community,

Beim Implementieren des *.obj-Datei-Format wollte ich wie gewohnt die Texturen, deren Strings ich zuvor aus einer dazugehörigen Materialdatei ausgelesen habe, laden. Wie gewohnt deswegen, weil es bei allen anderen Dateiformaten(*.x,*.p5m(eigenes Format),*.3ds)
auch funktioniert hat.
Diesmal jedoch werden die Texturen nicht geladen, auch ein Test mit einem ifstream-Objekt, ob die Datei überhaupt besteht, schlägt fehl.
Die Texturen liegen aber zu 100% am richtigen Ort.
Hier der Code(den Test habe ich auskommentiert, da er auch immer falsch ergab):

Code: Alles auswählen

for(DWORD i = 0; i < anz_Tex; i++)
		{
			ifstream test;
			char	filename2[512];
			sprintf_s(filename2,512,"%s",texNames[i].c_str() );
			//test.open(filename2);
			//if(test.is_open() == TRUE)
			//{
				if( (D3DXCreateTextureFromFile( g_graphdevice, filename2,
											 	  &textures[i])) < 0)
			
				{
					textures[i] = NULL;
					sprintf_s(acDebug, 256, "Textur konnte nicht geladen werden! Datei: %s",filename2);
					anz_Tex--;
					goto e_exit;
				}
			//}
			/*else
			{
				textures[i] = NULL;
				anz_Tex--;
				sprintf_s(acDebug, 256, "Texturname konnte nicht gefunden werden!<br>Arbeitspfad: %s Datei: %s",curWD,filename2);
				goto e_exit;
			}*/
		}
Zur Erklärung:
In texNames sind alle Strings ordnungsgemäß gespeichert, das habe ich auch schon beim debuggen überprüft.
Das Device g_graphdevice ist auch initialisiert.
Der Speicher für die Texturen auch allokiert.
Der Versuch als Dateiname in die Funktion gleich den c_str() einzusetzen schlug ebenfalls fehl.

Lange Vorrede kurze Frage: Hat jemand eine Ahnung, ob DirektX in dem Zusammenhang den char[512] ablehnt? Wäre WCHAR besser?
Oder sieht jemand vllt. einen ganz anderen Fehler.
Danke im voraus.

Mfg Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 19:43
von kimmi
Kann es sein, dass die besagten Texturfiles ohne Pfadangaben in dem mtl stehen? Schau dir im Debugger doch mal an, welche Filenamen an D3DXCreateTextureFromFile uebergeben werden.

Gruss Kimmi

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 19:53
von Droven
Hi kimmi,

danke für die schnelle Antwort.

Ja Pfadangaben sind mit gespeichert zb: "C:\Programme\...\textur_xyz.jpg".

Habe auch versucht die Pfade relativ anzugeben, also nur zb: "Textures\ filename.jpg", das sollte eigentlich auch funktionieren, da er ja dann vom Arbeitspfad ausgeht.

MfG Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 19:59
von kimmi
Wenn du deine Chars mit '\0' terminierst, sollte das gehen. Hast du vielleicht statt '\\' nur ein '\' angegeben?

Gruss Kimmi

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:02
von Aramis
Was sagt der Rückgabewert von D3DXCreateTextureFromFile? Ansonsten könnten die Backslashes im Pfad auch evtl. falsch oder inkonsistent sein. Ansonsten kannst du direkt den c_str() angeben ... in ein separates Array umkopieren ändert nichts.

Alex

EDIT: Kimmi war schneller

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:05
von kimmi
Gerade der inkonsistente Separator ist da sehr beliebt. ich habe mir da auch mal eine Falle mit gestellt :).

Gruss Kimmi

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:19
von Droven
Hi,

Also die Strings haben immer einen doppelten Backslash zwischen den Ornderangaben.
Und sind auch Null-terminiert.
Gerade der inkonsistente Separator ist da sehr beliebt. ich habe mir da auch mal eine Falle mit gestellt
Mir ist sowas auch schon untergekommen;) Damals konnte ich das Problem allerdings damit auch lösen^^

MfG Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:29
von Aramis
Also die Strings haben immer einen doppelten Backslash zwischen den Ornderangaben.
Aber nicht im .mtl-File, oder? Der doppelte Backslash ist ein C++-Feature und dient dem Compiler im Quellcode als Substituent für einen einfachen Backslash ... im laufenden Programm darf er nicht mehr auftreten.

Alex

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:34
von Droven
Hi,

Ich füge nach jedem Export, füge ich einen dopellten Backslash in die Datei ein.

Die Logfile sagt Folgenedes: "WARNING: Textur konnte nicht geladen werden! Datei: C:\\Programme\\Autodesk\\3ds Max 2009\\maps\\Wood\\Driftwd.jpg"

MfG
Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:36
von Aramis
Ich füge nach jedem Export, füge ich einen dopellten Backslash in die Datei ein.
Und genau das ist falsch. Siehe mein Posting oben.

Alex

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:52
von Droven
Hi,

Achso^^ Sry, MIssverständnis.
Aber ohne doppelten klappt es auch nicht.
Logdatei:
WARNING: Textur konnte nicht geladen werden! Datei: C:\Programme\Autodesk\3ds Max 2009\maps\Wood\Driftwd.jpg
MfG Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 20:57
von kimmi
Pack es mal testweise in einen Pfad ohne Leerzeichen bzw. lege es mal direkt in den Ordner deines Binaries. Vielleicht sind die die Uebeltaeter.

Gruss Kimmi

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 21:09
von Droven
Ich habe schon so ziemlich viel ausprobiert.
Die Texturen liegen alle in Textures\...
Damit habe ich es wie gesagt auch schon probiert.

MfG Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 21:23
von kimmi
Was fuer ein Fehlercode liefert die Funktion? Wenn sogar der Zugriff per fstream scheitert, liegt es wahrscheinlich an deinem Pfad bzw. Namensangabe.

Gruss Kimmi

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 21:47
von Droven
Die Funktion gibt INVALID_DATA zurück, aber da steht nix weiter zu in der DirectX Doku,
Ich versuch jetzt mal den Texturnamen hart zu kodieren.

MfG
Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 10.03.2009, 22:12
von kimmi
Ich habe mal bezueglich deiner Fehlermeldung im INet gesucht. Scheint zurueckgegeben zu werden, wenn die Texturfiles nicht gefunden werden.

Gruss Kimmi

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 11.03.2009, 00:03
von Schrompf
Aktiviere mal die DirectX-Debug-Runtime. Die gibt üblicherweise eine genauere Fehlerbeschreibung aus. Die Rückgabewerte dieser Funktionen sind doch für den Arsch... die könnten meiner Meinung nach auf "Out Of VidMem", "Would wait" und "Something's fucked up" reduziert werden.

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 11.03.2009, 10:47
von Alexander Kornrumpf
kimmi hat geschrieben:Pack es mal testweise in einen Pfad ohne Leerzeichen bzw. lege es mal direkt in den Ordner deines Binaries. Vielleicht sind die die Uebeltaeter.

Gruss Kimmi
zum Thema Leerzeichen soviel ich weiß ist das ein gültiger Pfad

Code: Alles auswählen

"X:\Ordner mit Leerzeichen\"
und das

Code: Alles auswählen

X:\Ordner_ohne_Leerzeichen\
aber nicht

Code: Alles auswählen

X:\Ordner mit Leerzeichen\
sprich die "" sind wichtig.

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 11.03.2009, 14:09
von Lynxeye
Initalisiere das Chararray am Anfang am besten mit 0. Ansonsten kann auch das Probleme machen. Bin ich auch mal drüber gestolpert, als ich mit dem rumkopieren von Pfaden zu tun hatte.

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 11.03.2009, 18:22
von Droven
Danke für die vielen Vorschläge, ich werde das Ganze jetzt erstmal testen.

Zitat von Schrompf:
Die Rückgabewerte dieser Funktionen sind doch für den Arsch... die könnten meiner Meinung nach auf "Out Of VidMem", "Would wait" und "Something's fucked up" reduziert werden.
Wem sagst du das...
Nicht nur das die Rückgabewerte teilweiße sinnlos erscheinen, gibt die Dokumentation fast nie irgendwelche Lösungsansätze oder Erfahrungsberichte.

Gut wollen wir sie nicht zu sehr verdammen.

MfG Droven

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 11.03.2009, 19:11
von Droven
Hart kodiert hat funktioniert.
Die ""-Zeichen einzufügen hat nicht geklappt, dennoch glaube ich den banalen Fehler gefunden zu haben.
Ich habe mir mal das char-Array genau aufschlüsseln lassen und musste feststellen, dass das erste Zeichen schlichtweg ein Leerzeichen ist.
Ich werde mir jetzt einen Algorithmus ausdenken, der das schon beim Einlesen verhindert. Dürfte kein Problem sein.
Ich probiers aus und schreib, ob es funktioniert hat.

Re: [DX9,C++] D3DXCreateTextureFromFile -> INVALID_DATA

Verfasst: 11.03.2009, 19:45
von Droven
Hallo,

Okay, ich hatte nachdem der newmtl-Befehl kam die ganze Zeile und somit auch das Leerzeichen zwischen dem Pfad und dem Befehl mit eingelesen. Dies wird jetzt verhindert, indem ich nach dem Befehl noch ein Zeichen einlese und dann erst den Pfad.
Danke für die vielen Vorschläge.

MfG Droven