DirectX7 - wie blitte ich einen Ausschnitt einer Textur?



  • Hi,

    wie kann ich in DirectX7 einen Teil-Ausschnitt einer Textur (rechteckig) auf den Screen rendern?

    Nehmen wir mal an, ich habe eine Textur 32 x 2048 und möchte davon ein 32 x 32 Quadrat "ausschneiden". 🙄

    Bisher habe ich immer nur komplette Texturen gerendert mit:

    m_pd3dDevice->SetTexture( 0, D3DTextr_GetSurface("tex2.tga") );

    Rect[0] = D3DTLVERTEX( D3DVECTOR( X_pos, sprite_bottom, 0.99f), 0.5f, 0xffffffff, 0, 0, 1 );
    Rect[1] = D3DTLVERTEX( D3DVECTOR( X_pos, Y_pos, 0.99f), 0.5f, 0xffffffff, 0, 0, 0 );
    Rect[2] = D3DTLVERTEX( D3DVECTOR( sprite_right, sprite_bottom, 0.99f), 0.5f, 0xffffffff, 0, 1, 1 );
    Rect[3] = D3DTLVERTEX( D3DVECTOR( sprite_right, Y_pos, 0.99f), 0.5f, 0xffffffff, 0, 1, 0 );

    m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX, Rect, 4, 0 );

    (mein Framework habe ich von der Particle-Chamber:
    http://www.gamedev.net/directory/links/count.asp?listingid=305 )

    Danke,

    Chris :p



  • Rect[0] = D3DTLVERTEX( D3DVECTOR( X_pos, sprite_bottom, 0.99f), 0.5f, 0xffffffff, 0, [b]0[/b], [b]1[/b] ); 
    Rect[1] = D3DTLVERTEX( D3DVECTOR( X_pos, Y_pos, 0.99f), 0.5f, 0xffffffff, 0, [b]0[/b], [b]0[/b] ); 
    Rect[2] = D3DTLVERTEX( D3DVECTOR( sprite_right, sprite_bottom, 0.99f), 0.5f, 0xffffffff, 0, [b]1[/b], [b]1[/b] ); 
    Rect[3] = D3DTLVERTEX( D3DVECTOR( sprite_right, Y_pos, 0.99f), 0.5f, 0xffffffff, 0, [b]1[/b], [b]0[/b] );
    

    Die letzten Parameter des D3DTLVERTEX Konstruktors sind doch die Texturkoordinaten. Diese habe einen Bereich von 0 bis 1 (jeweils für X/Y Richtung).
    Wenn du nur 32x32 aus einer Textur der Größe 32x2048 haben willst, dann must den obigen Code wie folgt ändern:

    Rect[0] = D3DTLVERTEX( D3DVECTOR( X_pos, sprite_bottom, 0.99f), 0.5f, 0xffffffff, 0, [b]0[/b], [b]32.0f / 2048.0f[/b] ); 
    Rect[1] = D3DTLVERTEX( D3DVECTOR( X_pos, Y_pos, 0.99f), 0.5f, 0xffffffff, 0, [b]0[/b], [b]0[/b] ); 
    Rect[2] = D3DTLVERTEX( D3DVECTOR( sprite_right, sprite_bottom, 0.99f), 0.5f, 0xffffffff, 0, [b]1[/b], [b]32.0f / 2048.0f[/b] ); 
    Rect[3] = D3DTLVERTEX( D3DVECTOR( sprite_right, Y_pos, 0.99f), 0.5f, 0xffffffff, 0, [b]1[/b], [b]0[/b] );
    


  • Sehr einleuchtend Illuminator 😃

    Danke,

    Chris


Anmelden zum Antworten