Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » DirectX » Texturkoordinaten ungenau

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.04.2005, 16:34 Uhr
Oliver
S2-Pixelgeneral


Hi,

ich hab folgenden Code geschrieben, um ne Textur zu rendern (in 2D mit rhw vertices!) Das klappt auch soweit, allerdings ist es manchmal etwas ungenau, wenn ich nur Teile davon rendern will, d.h. es wird nicht 1:1 übernommen, sondern immer mit kleinen Veränderungen. Was kann man dagegen machen? Wie ich Gleitkommazahlen hasse.



C++:
// Vertex
#define D3DFVF_VERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

typedef struct D3DVERTEX_TYPE {
   float     x;
   float     y;
   float     z;
   float   rhw;
   DWORD color;
   float tx,ty;
   } D3DVERTEX;

[...]


void Direct3D::DrawSprite(const Sprite& sprite,const int& x,const int& y,const RECT*srcrect,const D3DCOLOR& modulate)
{
    // Alphablending aktivieren
    m_device->SetRenderState(D3DRS_ALPHABLENDENABLE,1);
    m_device->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
    m_device->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
    m_device->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);
    
    // Vertices erstellen
    D3DVERTEX dv_rect[4]=
    {
        {float(x),float(y),0.0f,1.0f,modulate,0.0f,0.0f},
        {float(x+sprite.width),float(y),0.0f,1.0f,modulate,1.0f,0.0f},
        {float(x+sprite.width),float(y+sprite.height),0.0f,1.0f,modulate,1.0f,1.0f},
        {float(x),float(y+sprite.height),0.0f,1.0f,modulate,0.0f,1.0f}
    };
    
    // Wenn srcrect gültig ist, müssen wir die Texturkoordinaten entsprechend anpassen
    if(srcrect)
    {
        dv_rect[0].tx=float(srcrect->left)/float(sprite.width);
        dv_rect[0].ty=float(srcrect->top)/float(sprite.height);
        dv_rect[2].tx=float(srcrect->right)/float(sprite.width);
        dv_rect[2].ty=float(srcrect->bottom)/float(sprite.height);
        dv_rect[1].tx=dv_rect[2].tx;
        dv_rect[1].ty=dv_rect[0].ty;
        dv_rect[3].tx=dv_rect[0].tx;
        dv_rect[3].ty=dv_rect[2].ty;

        dv_rect[2].x=dv_rect[2].tx*(dv_rect[2].x-dv_rect[0].x)+dv_rect[0].x;
        dv_rect[2].y=dv_rect[2].ty*(dv_rect[2].y-dv_rect[0].y)+dv_rect[0].y;
        dv_rect[1].x=dv_rect[2].x;
        dv_rect[3].y=dv_rect[2].y;
    }
    
    // In den Vertexbuffer kopieren
    BYTE*VertexBufferStart;
    m_VB->Lock(0,0,(void**)&VertexBufferStart,0);
    memcpy(VertexBufferStart,dv_rect,sizeof(dv_rect));
    m_VB->Unlock();
    
    // Textur setzen
    m_device->SetTexture(0,sprite.m_textur);
    
    // Und schließlich zeichnen
    m_device->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
    
    // Alphablending wieder deaktivieren
    m_device->SetRenderState(D3DRS_ALPHABLENDENABLE,0);
}


--
Demokratie ist die Diktatur der Mehrheit.

www.siedler25.org/ ( Siedler2 - Remake )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ DirectX ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: