Konsole im DirectX Programm



  • Ich meinte was anderes: Wie genau kommen denn deine 3D Punkte auf 2D Pixelkoordinaten? Welche Rolle spielen World, View und Projection Matrix, also was genau tut die Transformationspipeline, was kommt hinten raus?



  • Das kann ich dir nicht wirklich beantworten...
    Ich weiß wie die Helligkeit, sprich Farbe der einzelnen Ebenen Zustande kommt,
    aber wie die Objekte ausgelesen werden, wie entschieden wird welche Faces gar nicht gezeichnet werden müssen, oder was überhaupt genau in der Pipeline passiert weiß ich nicht.



  • Darum geht's auch nicht. Beantworte einfach mal dir selbst und uns hier die Frage, was genau eigentlich World, View und Projection Matrix tun.



  • Die Viewmatrix beinhaltet einmal Position der Kamera, wo die Kamera hinzeigt und welche wo "oben" ist.

    Die Projektionsmatrix erstellt so wie ich das deute, den Sichtkegel.
    Ich gebe an die Größe des Screens (größe der Clipingebene, also das 2D feld das auf meinen Bildschirm geworfen wird), das field of view in rad, sowie den Sichtbereich mit min und max.
    Aus diesen beiden Matrizen kann man sehr gut den Sichtkegel bauen. Ich weiß wo er anfängt, wo er hinzeigt, wie sich die Sichtbereiche in Rad ausbreiten, etc...
    wie auf diesem bild gut sichtbar:
    http://directx9kick.uw.hu/files/01fig02.gif

    und die Weltmatrix müsste dann ja jetzt auch vom kartesischem Nullpunkt das darzustellende Objekt beschreiben. Wie ist es gedreht, wohin wird es verschoben etc.

    Seh ich das richtig das ich jetzt meine Projektionsmatrix/Viewmatrix vor dem ausgeben der ebene, direkt zu 0/0/0 schieben soll und dann die Ebene ohne Weltmatrix (oder Einheitsmatrix) ausgeben soll?



  • Ok, dir fehlt es offenbar an den mathematischen Grundlagen. Ich würde dir sehr empfehlen, dich damit zu beschäftigen.

    Aber gut, dann hier einfach der Trick: Du setzt World, View und Projection auf Identity, dann gehen deine Vertices direkt in den Clipspace. Der Punkt (-1, 1, 0) mapped dann auf die linke obere und (1, -1, 0) auf die rechte untere Ecke des Viewport auf der Near Plane. D.h. (-1, 1, 0), ( 1, 1, 0), ( 1,-1, 0), (-1,-1, 0) sind dann die Koordinaten der Eckpunkte eines bildfüllenden Vierecks auf der Near Plane im Uhrzeigersinn beginnend mit links oben...



  • ok das ist tatsächlich cool.
    Ich hatte nicht den Gedanken, dass ich zwischen den Objekten den Blickpunkt frei verändern kann...

    Es ist sicherlich nützlich ja. Ich komme sonst aber ganz gut zurecht mit der Mathematik. Das hier war ja mehr ein Überlegungsproblem. Ich merke aber das ich so, nur ein Minimum der Fähigkeiten von DirectX abschöpfe... überdenkenswürdig.

    Danke dir 🙂



  • cl90 schrieb:

    Ich merke aber das ich so, nur ein Minimum der Fähigkeiten von DirectX abschöpfe... überdenkenswürdig.

    Ich würde dir sowieso empfehlen, dich mit Shadern zu beschäftigen. Das fördert nicht nur das Verständnis und macht die Dinge sehr viel einfacher, sondern hilft dir auch, am Ende von D3D9 loszukommen, was diese Tage auf jeden Fall sein Ziel sein sollte, da diese API einfach hoffnungslos veraltet ist. Und so lange du die FFP nutzt, ist "ein Minimum der Fähigkeiten von DirectX abschöpfen" sogar was D3D9 betrifft rein prinzipiell schon maßlos untertrieben...



  • Sobald ich mich mit richtiger Spieleprogrammierung beschäftige werde ich auch nach einer Außeinandersetzung mit Shadern zu DX 11 wechseln. Aber mommentan arbeite ich wie gesagt an einem Projekt das auch auf Firmen PCs laufen muss und da wird erst bald auf Win7 umgestellt...

    Aber prinzipiell hast du da vollkommen recht.



  • ok... jetzt ergeben sich kleine Schwierigkeiten mit der Textur.
    Die Textur wird unsauber, pixelig und "unrund" dargestellt. (Die Reihenfolge der Ecken stimmt. Der Text der in der Textur ist, ist nicht gedreht/spiegelverkert)
    Derzeitig steht die Fenstergröße auf 1280x900. Die Textur die ich lade hat genau die selbe Größe. Das Viereck das ich zum zeichnen der Textur nehme ist ein Quadrat. Ist das der Ursprung meines problems?

    hier das zeichnen:

    m_d3ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
    	m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    
    	m_d3ddev->SetTransform(D3DTS_WORLD,			&m_identity);
        m_d3ddev->SetTransform(D3DTS_VIEW,			&m_identity);   
    	m_d3ddev->SetTransform(D3DTS_PROJECTION,	&m_identity);
    
    	m_view->set_light_clip();
    
    	m_d3ddev->SetTexture(0, *m_meshTextures[4]); 
    	for(i = 0; i < m_mesh[0].numMaterials; i++)
    	{
    		m_d3ddev->SetMaterial(&m_mesh[0].meshMaterials[i]);
    		m_mesh[0].mesh->DrawSubset(i);
    	}
    	m_d3ddev->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
    	m_d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
    


  • Ist der Client Bereich deines Fensters bzw. dein BackBuffer wirklich 1280x900? Ich vermute mal, dass dem nicht so ist... 😉



  • ja stimmt. Das ganze Fenster ist 1280x900. der sichtbare Bereich ist nur 1263x861... kann man das genau ausrechnen/auslesen?

    edit:
    ok hier steht aber das er genau die größe hat:

    m_d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
        m_d3dpp.BackBufferWidth = SCREEN_WIDTH;
        m_d3dpp.BackBufferHeight = SCREEN_HEIGHT;
    




  • das ist wirklich praktisch.
    ich krieg als neue werte 1296x958. Die werte setz ich dann in mein WC create ein aber es sieht immer noch falsch aus...

    RECT test;
    	test.top		= 0;
    	test.bottom		= SCREEN_HEIGHT;
    	test.left		= 0;
    	test.right		= SCREEN_WIDTH;
    	AdjustWindowRect(&test, WS_OVERLAPPEDWINDOW, false);
    
    	int width, height;
    
    	width	= test.right - test.left;
    	height	= test.bottom - test.top;
    
        HWND hWnd;
        WNDCLASSEX wc;
    
        ZeroMemory(&wc, sizeof(WNDCLASSEX));
    
        wc.cbSize			= sizeof(WNDCLASSEX);
        wc.style			= CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc		= WindowProc;
        wc.hInstance		= hInstance;
        wc.hCursor			= LoadCursor(NULL, IDC_ARROW);
        wc.lpszClassName	= "WindowClass";
    
        RegisterClassEx(&wc);
    
        hWnd = CreateWindowEx(NULL, "WindowClass", "HexapodSiSO",
    						  WS_OVERLAPPEDWINDOW, 0, 0, width, height,
                              NULL, NULL, hInstance, NULL);
    

Anmelden zum Antworten