Seite 1 von 1

Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 11.10.2010, 23:31
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

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 12.10.2010, 14:12
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

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 12.10.2010, 15:02
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

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 12.10.2010, 15:43
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.

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 13.10.2010, 08:26
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 ;)

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 14.10.2010, 13:23
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.

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 14.10.2010, 13:33
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...

Re: Problem beim Texture Load DX 8.1 und DX 9

Verfasst: 14.10.2010, 14:06
von Alexander Kornrumpf
Wenn diese Benutzer seine Zielgruppe sind, halte ich as Vorgehen nur für Benutzerfreundlich.