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

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Zuletzt geändert von Droven am 25.03.2009, 21:57, insgesamt 1-mal geändert.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag von kimmi »

Wenn du deine Chars mit '\0' terminierst, sollte das gehen. Hast du vielleicht statt '\\' nur ein '\' angegeben?

Gruss Kimmi
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag von kimmi »

Gerade der inkonsistente Separator ist da sehr beliebt. ich habe mir da auch mal eine Falle mit gestellt :).

Gruss Kimmi
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag 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
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

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

Beitrag 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
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag 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
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

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

Beitrag von kimmi »

Ich habe mal bezueglich deiner Fehlermeldung im INet gesucht. Scheint zurueckgegeben zu werden, wenn die Texturfiles nicht gefunden werden.

Gruss Kimmi
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

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

Beitrag 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.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Alexander Kornrumpf
Moderator
Beiträge: 2112
Registriert: 25.02.2009, 13:37

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

Beitrag 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.
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

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

Beitrag 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.
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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.
Droven
Beiträge: 25
Registriert: 05.03.2009, 08:48
Echter Name: David Lorenz
Wohnort: Dresden

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

Beitrag 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
Antworten