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 ) |