In realer Größe zeichnen [DirectX]



  • Mit deinem Code ändert sich nichts, das Sprite wird immer noch >100px angezeigt.



  • Welche Grösse hat dein Backbuffer? Und welche Grösse hat das Present-Rect?

    Ich würde mal darauf tippen dass der Backbuffer beim Present hochskaliert wird...



  • zeig den code wo du die orhtogonale projektionsmatrix setzt



  • hustbaer schrieb:

    Welche Grösse hat dein Backbuffer? Und welche Grösse hat das Present-Rect?

    Ich würde mal darauf tippen dass der Backbuffer beim Present hochskaliert wird...

    Öhm, ich setze einfach mal etwas Code hier rein.

    //Presentation parameters - how the device should work like	
    	pres_param.Windowed = Windowed;
    	pres_param.SwapEffect = D3DSWAPEFFECT_DISCARD;
    	pres_param.BackBufferCount = 1;
    
    	if (!Windowed)
    	{
    	    pres_param.BackBufferWidth = width;    // set the width of the buffer
    		pres_param.BackBufferHeight = heigth;    // set the height of the buffer
    	}
    	pres_param.BackBufferFormat = (Windowed) ? D3DFMT_UNKNOWN : D3DFMT_X8R8G8B8;
    	pres_param.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
    
    	//Now create the device!
    	HRESULT hr = d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &pres_param, &d3ddev);
    

    Present-Aufruf:

    d3ddev->EndScene();
    	state = d3ddev->Present(NULL, NULL, NULL, NULL);
    

    zeig den code wo du die orhtogonale projektionsmatrix setzt.

    Tut mir Leid, ich weiß leider nicht, wovon du redest. Wie in meinem 1. Code zu sehen ist, erstelle ich eine 2D-Matrix, um das Sprite zu kontrollieren.



  • Dir sagt Projektionsmatrix nichts?



  • welche D3D Version nutzt du?



  • Vertexwahn schrieb:

    welche D3D Version nutzt du?

    Ich nutze DirectX 9.

    d3d=Direct3DCreate9(D3D_SDK_VERSION);
    

    Eisflamme schrieb:

    Dir sagt Projektionsmatrix nichts?

    Doch, aber ich habe keine in meinem Code. Die einzige Matrix, die ich brauche, ist die Transformationsmatrix, um mein Sprite zu drehen, skalieren usw. (s. 1. Post).



  • Falsch, du brauchst auch eine Projektionsmatrix.

    D3DXMATRIX ortho;
    			D3DXMATRIX identity;
    
    			D3DXMatrixIdentity(&identity);
    			D3DXMatrixOrthoLH(&ortho, m_size.x, m_size.y, -1.0f, 1.0f );
    
    			m_d3d_device->SetTransform(D3DTS_VIEW, &identity);
    			m_d3d_device->SetTransform(D3DTS_PROJECTION, &ortho);
    			m_d3d_device->SetRenderState( D3DRS_LIGHTING, TRUE );
    

    So als bsp. wo m_size hier die Größe vom Fenster ist.



  • Du brauchst nicht unbedingt eine Projektionsmatrix. Aber wenn du nicht entsprechende Vorkehrungen triffst (z.B. eben durch eine entsprechende Projektionsmatrix) dann landest du direkt im Clipspace (d.h. (-1,1) ist links oben und (1, -1) rechts unten am Bildschirm) und musst deine Koordinaten natürlich auch entsprechend wählen...



  • Gerade wenn man 2D Sprites macht kann man auch einfach pretransformed Vertices verwenden.



  • Scorcher24 schrieb:

    Falsch, du brauchst auch eine Projektionsmatrix.

    D3DXMATRIX ortho;
    			D3DXMATRIX identity;
    
    			D3DXMatrixIdentity(&identity);
    			D3DXMatrixOrthoLH(&ortho, m_size.x, m_size.y, -1.0f, 1.0f );
    
    			m_d3d_device->SetTransform(D3DTS_VIEW, &identity);
    			m_d3d_device->SetTransform(D3DTS_PROJECTION, &ortho);
    			m_d3d_device->SetRenderState( D3DRS_LIGHTING, TRUE );
    

    So als bsp. wo m_size hier die Größe vom Fenster ist.

    Und wo soll ich deinen Code reinsetzen? In der Draw-Funktion funktioniert er auf jeden Fall nicht, dann wird gar nichts mehr gezeichnet.

    hustbaer schrieb:

    Gerade wenn man 2D Sprites macht kann man auch einfach pretransformed Vertices verwenden.

    Und wie implementiere ich diese? Ich bitte um Code oder um einen geeigneten Link zum Nachlesen. 🙂



  • Wie wär's damit wenn du dir mal ein paar Artikel zum Thema Direct3D suchst und diese liest?
    Ein bisschen Eigeninitiative ist schon erforderlich wenn man etwas programmieren möchte.



  • http://msdn.microsoft.com/en-us/library/bb219690(VS.85).aspx

    und nochmal von Nvidia: http://developer.nvidia.com/attach/6586

    abgesehen davon würde ich auf D3D11 wechseln 😉



  • Für D3D11 halte ich es für Hobbyisten noch zu früh. Die meisten werden über DX10 Hardware momentan nicht rauskommen. Die wenigsten haben eine DX11 Grafikkarte.

    http://store.steampowered.com/hwsurvey
    Laut Steam gerade mal 5.6%.
    Wird sich dieses Jahr eventuell noch ändern, da Kracher wie BF3 auf DX11 setzen. Aber die Glaskugeln hat nicht immer recht ;).
    Ich würde eher zu OpenGL3 raten, da Spiele auf anderen Platformen immer mehr im kommen sind. Der Mac ist auf dem Vormarsch, die Indie-Studios nehmen Linux ins Visier.


  • Mod

    das schoene an DX11 ist dass es feature level gibt, man also problemlos auf dx9 karten laufen kann und wenn man was neueres irgendwann nutzen moechte, muss man nicht erst von dx9 auf dx11 umsteigen, sondern nutzt ein neues featurelevel.
    von daher wuerde ich dx11 schon empfehlen, selbst wenn man nur dx9 dinge programmieren will.



  • Abgesehen davon kann man mit d3d11 Features von d3d10 Hardware nutzen die man mit d3d10 nicht nutzen kann 😉



  • Vertexwahn schrieb:

    http://msdn.microsoft.com/en-us/library/bb219690(VS.85).aspx

    und nochmal von Nvidia: http://developer.nvidia.com/attach/6586

    abgesehen davon würde ich auf D3D11 wechseln 😉

    Die Frage ist: Wie wende ich das jetzt auf meinen Code an? Im Prinzip rechnet D3D alles für mich, ich habe auch keine Matrizen, mit denen ich hantiere, sondern D3DXMatrixTransformation2D() macht das selbst.

    Aus den Links konnte ich eig. nur entnehmen, dass ich die Position der Sprites um 0.5f in x- und y- Richtung verschieben muss, um eine korrekte Anzeige zu bekommen.
    Das klappt allerding nicht:

    D3DXVECTOR2 trans = D3DXVECTOR2((float)posx+0.5f, (float)posy+0.5f);
    

    Bei meinen weiteren Recherchen hat sich ergeben, dass ich vielleicht die Größe des Backbuffers falsch gesetzt habe. Nun sieht der Code folgendermaßen aus:

    GetClientRect(hWnd, &test);
    pres_param.BackBufferWidth = test.right;
    pres_param.BackBufferHeight = test.bottom;
    

    Laut MSDN werden die Matrizen von DX selbst miteinander multipliziert:

    Remarks

    This function calculates the affine transformation matrix with the following formula, with matrix concatenation evaluated in left-to-right order:

    Mout = Ms * (Mrc)-1 * Mr * Mrc * Mt

    where:

    Mout = output matrix (pOut)

    Ms = scaling matrix (Scaling)

    Mrc = center of rotation matrix (pRotationCenter)

    Mr = rotation matrix (Rotation)

    Mt = translation matrix (pTranslation)

    Mittlerweile habe ich zur Sicherheit alle Variablen, Funktionen usw. auf float gesetzt, damit nichts durch ínts wegfallen kann.


Anmelden zum Antworten