Problem beim Texture Load DX 8.1 und DX 9

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Tornby
Beiträge: 17
Registriert: 17.09.2010, 15:33

Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Tornby »

Hallo,

ich habe eine Problem beim Laden von Texturen mit DirectX 8.1. Habe mein Programm von DirectX 9 auf 8.1 portiert und seitdem lädt er auf >>einem<< meiner Rechner die Texturen nicht richtig bzw. ich erhalte über GetLevelDesc bei Breite und Höhe nur die PowerOf2 Werte (also immer der Größere auf 32,64,128 etc.). Dementsprechend sieht das dann sehr merkwürdig aus. Auf meiner HD4890 gehts, nur nicht auf meiner alten Radeon mit GTO2 Chip. Ich hab auch ein DirectX 8.1 Programm wo das jedoch geht und die richtige Größe ermittelt wird... Im Unterschied hierzu lädt das Programm aber PNG's anstatt wie ich 32 Bit TGA (mit Alpha Channel) und macht wahrscheinlich irgendwas anders. Am Wochenende werde ich das ganze wohl mal zerfpflücken und ausprobieren. Wollte hier nur mal anfragen, vielleicht hat jemand spontant ne Idee wie ich da ansetzen kann...

Ursprüngliche DirectX 9 Present Parameters:

Code: Alles auswählen

	DEBUG_LOG("Initializing Present Parameters...");

	ZeroMemory(&m_d3DPP, sizeof(m_d3DPP));
	m_d3DPP.Windowed = (false == m_viewport->GetExclusive());
	m_d3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
	m_d3DPP.EnableAutoDepthStencil = m_viewport->GetZBufferEnabled();
	m_d3DPP.AutoDepthStencilFormat = D3DFMT_D16;
	m_d3DPP.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
	m_d3DPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
	m_d3DPP.BackBufferCount = 1;
	m_d3DPP.hDeviceWindow = m_viewport->GetHandle();
	m_d3DPP.BackBufferWidth = m_viewport->GetWidth();
	m_d3DPP.BackBufferHeight = m_viewport->GetHeight();
	m_d3DPP.BackBufferFormat = D3DFMT_A8R8G8B8;
	m_d3DPP.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
Neue DirectX 8.1 Present Parameters:

Code: Alles auswählen

	DEBUG_LOG("Initializing Present Parameters...");

	ZeroMemory(&m_d3DPP, sizeof(m_d3DPP));
	m_d3DPP.Windowed = (false == m_viewport->GetExclusive());
	m_d3DPP.SwapEffect = D3DSWAPEFFECT_DISCARD;
	m_d3DPP.EnableAutoDepthStencil = m_viewport->GetZBufferEnabled();
	m_d3DPP.AutoDepthStencilFormat = D3DFMT_D16;

	if (false == m_d3DPP.Windowed)
	{
		m_d3DPP.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
		m_d3DPP.FullScreen_PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;	
	}

	m_d3DPP.BackBufferCount = 1;
	m_d3DPP.hDeviceWindow = m_viewport->GetHandle();
	m_d3DPP.BackBufferWidth = m_viewport->GetWidth();
	m_d3DPP.BackBufferHeight = m_viewport->GetHeight();
	m_d3DPP.BackBufferFormat = D3DFMT_X8R8G8B8;
	
	m_d3DPP.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
Methode zum Laden der Texture (D3DX_DEFAULT habe ich auch schon durch NULL ersetzt führte aber zum gleichen Ergebnis):

Code: Alles auswählen

	LPDIRECT3DTEXTURE8 pNewTex;
	D3DSURFACE_DESC    SurfaceDesc;

	D3DXCreateTextureFromFileExA(m_d3DDevice,
		_filename,	
		D3DX_DEFAULT,
		D3DX_DEFAULT,
		1,
		NULL,
		D3DFMT_UNKNOWN,
		D3DPOOL_MANAGED,
		D3DTEXF_POINT,
		D3DTEXF_POINT,
		0,
		NULL,
		NULL,
		&pNewTex);

	if (pNewTex == NULL) 
		return;
	
	pNewTex->GetLevelDesc(0,&SurfaceDesc);
	m_filename = _filename;
	m_width = SurfaceDesc.Width; // Auf allen Rechnern die Richtige Breite und...
	m_height = SurfaceDesc.Height; // auch Höhe bis auf einen mit ner Radeon GTO2 Chipset
	m_data = pNewTex;
Wenn einer Ideen hat wie ich schneller an eine Lösung kommen könnte anstatt durchtesten wäre ich sehr dankbar. Würde mir Zeit sparen ;)

Ist eigentlich D3DFMT_X8R8G8B8 oder D3DFMT_A8R8G8B8 das sinnvollere Format, wenn ich eh nen Alpha Channel benutze? Nicht bei allen Bildern, aber halt bei den meisten...

Viele Grüße
Tornby
Matthias Gubisch
Establishment
Beiträge: 472
Registriert: 01.03.2009, 19:09

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Matthias Gubisch »

Also zu den Texturen kann ich nichts sagen (kein Erfahrung mit D3D8), aber zu den Formaten

Also mit Alphakanal solltest du IMHO D3DFMT_A8R8G8B8 verwenden..

Kannst du uns den Grund verraten warum du von dem veralteten D3D9 auf das noch ältere D3D8 wechseln willst?

Gruss
Matthias
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Tornby
Beiträge: 17
Registriert: 17.09.2010, 15:33

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Tornby »

Danke!
Ich benutze keine Features aus DirectX 9 und mit DX 8 habe ich eine wesentlich bessere Kompatibilität da es standardmässig mit Windows XP mitgeliefert wird. Läuft dann also auch auf älteren Kisten die noch kein Direct X 9 haben :D
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Lynxeye »

Und DX9 wird standardmäßig mit Windows Update für XP ausgeliefert. Außer ein paar Raubkopierern ohne Interesse an an DX wird also niemand mehr DX8.1 auf dem Rechner haben.
Matthias Gubisch
Establishment
Beiträge: 472
Registriert: 01.03.2009, 19:09

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Matthias Gubisch »

Lynxeye hat geschrieben:Und DX9 wird standardmäßig mit Windows Update für XP ausgeliefert. Außer ein paar Raubkopierern ohne Interesse an an DX wird also niemand mehr DX8.1 auf dem Rechner haben.
Ich bin mir sicher dass sogar von denen keiner mehr nur DirectX 8 auf dem Rechner hat ;)
Bevor man den Kopf schüttelt, sollte man sich vergewissern einen zu haben
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Alexander Kornrumpf »

Du würdest dich wundern wieviele Leute damals in der "OMG Microsoft verändert ungefragt meinen Computer" Hysterie (schlimmstenfalls mittels xpantispy) Autoupdate deaktiviert haben und seitem nie wieder ein Update gezogen haben -- in Retrospektive unglaublich, aber automatische Updates waren mal ein Aufreger und galten als ein sicheres Zeichen für die Bosheit von MS. Erst kürzlich den Fall gehabt, dass jemand ein Programm nicht installieren konnte weil der Installer geprüft hat ob mindestens WinXP SP2 (!) vorhanden ist, was es nicht war.
Benutzeravatar
Lynxeye
Establishment
Beiträge: 145
Registriert: 27.02.2009, 16:50
Echter Name: Lucas
Wohnort: Hildesheim
Kontaktdaten:

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Lynxeye »

Tja, dann ist der Benutzer aber auch selbst schuld. In dem Fall würde ich den (aus meiner Sicht sinnvolleren) Weg gehen einfach eine Fehlermeldung werfen, wenn DX9 nicht vorhanden ist und den Benutzer auffordern dies zu installieren, bevor ich extra dafür noch einen neuen Codepfad einbaue. Sollte zumutbar sein...
Alexander Kornrumpf
Moderator
Beiträge: 2119
Registriert: 25.02.2009, 13:37

Re: Problem beim Texture Load DX 8.1 und DX 9

Beitrag von Alexander Kornrumpf »

Wenn diese Benutzer seine Zielgruppe sind, halte ich as Vorgehen nur für Benutzerfreundlich.
Antworten