[directX] Diverse Probleme

Cromon

Erfahrenes Mitglied
Hallo zusammen!

Anstatt für alles einen eigenen Thread aufzumachen habe ich mich entschlossen einfach alle meine Probleme zu sammeln und hier auf zulisten. Ich werde dann über die Tags für die Suchmaschinen die nötigen Infos geben, da ja der Titel die Funktion nicht mehr erfüllt.

Hier mal meine Probleme und Fragen sortiert nach der Dringlichkeit:
1. http://www.imagr.eu/up/4aeea600602bc_agyria.JPG

Je weiter man sich von den Texturen entfernt desto mehr wird das Gelände grün und blau bis es schlussendlich nur noch grün/blau ohne die alten Texturen ist. Ich vermute, es hat was mit den Mipmaps zu tun, allerdings bin ich selbst nach stundenlangem Googeln mit "mimap farbfehler", "mimap distanz farbe ändert sich", usw nicht auf ein vergleichbares Problem mit Lösung gekommen.


2. Alphamaps für Texturen.

Ich bin mir aus OpenGL gewohnt, dass ich einer Texture ganz simpel eine weitere Textur hinzufügen kann, die nur Alphawerte besitzt und dass diese Alphatexur dann verwendet wird um die andere Textur über bereits bestehende zu blenden. Dies geschah da mit:
Code:
glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 64, 64, 0, GL_ALPHA, GL_UNSIGNED_BYTE, map[index]);

und beim Zeichnen mit
Code:
		glActiveTextureARB(GL_TEXTURE0_ARB);
		glBindTexture(GL_TEXTURE_2D, texture[i]);

		glActiveTextureARB(GL_TEXTURE1_ARB);
		glBindTexture(GL_TEXTURE_2D, alphamap[i - 1]);

Gibt es in directX einen vergleichbaren Vorgang?


3. Mausklicks

Ich versuche momentan gerade die Koordinaten eines Mausdrucks zu ermitteln. Dazu habe ich bisher den Punkt auf der zFar-Ebene und den Punkt auf der zNear-Ebene. Nun ist das Problem, dass ich ja wissen müsste, wo diese Gerade in mein Terrain einschlägt. Intersection habe ich bisher nur für Meshes gefunden, aber mein Terrain ist ja kein Mesh sondern ganz viele Vertices. Gibt es eine Möglichkeit, wie ich meinen zNear -> zVar - Strahl mit diesen Vertices intersektieren lassen kann?

Ich bin für jeden Tipp oder jeden Hinweis (am besten einfach einen Leitfaden oder ein wichtiges Schlüsselwort für mein Problem, keine fertige Lösung, ich möchte es nämlich verstehen und selber lösen :)) äusserst dankbar!

Gruss
Cromon
 
Hallo zusammen!

Beim Punkt Alphamaps bin ich doch schon etwas weiter gekommen. Ich habe eine Ahnung, wie ich das machen könnte, aber es funktioniert noch nicht. Das Rendering mache ich jetzt so:
Code:
for(ui32 i = 0; i < m_header.nTexLayers; ++i)
	{
		IDirect3DDevice9* dev = m_3dMgr->GetDevice();
		dev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
		dev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
		dev->SetTexture(1, m_alphaMaps[i]);
		dev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
		dev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_CURRENT);
		dev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2);
		m_3dMgr->SetTexture(m_textures[i], 0);
		m_3dMgr->DrawPrimitives(m_vbuffer, D3DPT_TRIANGLESTRIP, m_striplen, VERTEX_3FT2, m_indices, 145);
	}

Eigentlich mit der Absicht, dass der Alphawert von ARG2 (D3DTA_CURRENT -> alphamap) genommen wird für die Textur, die ich Rendere.

Die Alphamap an sich wurde so erstellt:
Code:
HRESULT hRes = D3DXCreateTexture(sD3DMgr.GetDevice(), 64, 64, 1, 0, D3DFMT_A8, D3DPOOL_MANAGED, &m_alphaMaps[a]);
		IDirect3DSurface9* pSurf;
		m_alphaMaps[a]->GetSurfaceLevel(0, &pSurf);
		RECT r;
		r.top = r.left = 0;
		r.bottom = r.right = 64;
		hRes = D3DXLoadSurfaceFromMemory(pSurf, 0, 0, map[a], D3DFMT_A8, 0, 0, &r, D3DX_DEFAULT, 0);

Man hat zwar schon einen Unterschied feststellen können, allerdings werden die einzelnen Texturphasen einfach entweder mit 255 Alpha oder mit 0 Alpha dargestellt.

Woran könnte das liegen?
Gruss
Cromon
 
Müsste das nicht

dev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );

sein? Sonst selektierst du ja nach wie vor das vorliegende Alpha.
 
Hallo Endurion,

Ja, da war einiges komisch. Gut sortiert habe ich jetzt das bekommen:
Code:
m_3dMgr->SetTexture(m_textures[i], 0);
		dev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1); // color
		dev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
		dev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_TEXTURE);

		dev->SetTexture(1, m_alphaMaps[i]);
		dev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_SELECTARG2); // colorstage
		dev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
		dev->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);

		dev->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG2); // alphastage
		dev->SetTextureStageState(1, D3DTSS_ALPHAARG1, D3DTA_CURRENT);
		dev->SetTextureStageState(1, D3DTSS_ALPHAARG2, D3DTA_TEXTURE);

Was seinen Dienst einwandfrei verrichtet :)
 
Zurück