amida maru
2009-12-06, 19:46:14
Hallo erstmal.
Also ich verwende DirectX9 für mein neues 2d game projekt. Erstmal hab ich die VertexBuffer locken - koordinaten ändern - vertexbuffer unlocken gelernt. hab dann gelesen dass das recht langsam ist. dann bin ich auf matrizen umgestiegen mit ner Ortho Matrix:
D3DXMatrixOrthoOffCenterLH(&matOrtho, 0, 800, 600, 0, 1.0f, 10.0f);
m_lpD3DDevice->SetTransform(D3DTS_PROJECTION, &matOrtho);
m_lpD3DDevice->SetTransform(D3DTS_WORLD, &matIdentity);
m_lpD3DDevice->SetTransform(D3DTS_VIEW, &matIdentity);
ok dann meine Sprite klasse die SetupQuad methode die ruf ich beim initialisieren EINMAL auf und beweg sie dann mit matrizen und zwar in der funktion Blit:
void Sprite::SetupQuad()
{
pGameService->GetD3DDevice()->CreateVertexBuffer(sizeof(GameService::VERTEX) * 6, NULL, pGameService->GetVertexFormat(), D3DPOOL_MANAGED, &m_pVertexBuffer, NULL);
m_pVertices = NULL;
m_pVertexBuffer->Lock(0, 6 * (sizeof(GameService::VERTEX)), (void**)(&m_pVertices), 0);
m_pVertices[0].color = 0xffffffff;
m_pVertices[0].x = 0.0f;
m_pVertices[0].y = 0.0f;
m_pVertices[0].z = 1.0f;
m_pVertices[0].u = 0.0f;
m_pVertices[0].v = 0.0f;
m_pVertices[1].color = 0xffffffff;
m_pVertices[1].x = 1.0f;
m_pVertices[1].y = 0.0f;
m_pVertices[1].z = 1.0f;
m_pVertices[1].u = 1.0f;
m_pVertices[1].v = 0.0f;
m_pVertices[2].color = 0xffffffff;
m_pVertices[2].x = 1.0f;
m_pVertices[2].y = 1.0f;
m_pVertices[2].z = 1.0f;
m_pVertices[2].u = 1.0f;
m_pVertices[2].v = 1.0f;
m_pVertices[3].color = 0xffffffff;
m_pVertices[3].x = 1.0f;
m_pVertices[3].y = 1.0f;
m_pVertices[3].z = 1.0f;
m_pVertices[3].u = 1.0f;
m_pVertices[3].v = 1.0f;
m_pVertices[4].color = 0xffffffff;
m_pVertices[4].x = 0.0f;
m_pVertices[4].y = 1.0f;
m_pVertices[4].z = 1.0f;
m_pVertices[4].u = 0.0f;
m_pVertices[4].v = 1.0f;
m_pVertices[5].color = 0xffffffff;
m_pVertices[5].x = 0.0f;
m_pVertices[5].y = 0.0f;
m_pVertices[5].z = 1.0f;
m_pVertices[5].u = 0.0f;
m_pVertices[5].v = 0.0f;
m_pVertexBuffer->Unlock();
pGameService->GetD3DDevice()->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(GameService::VERTEX));
}
void Sprite::Blit(int x, int y)
{
D3DXMATRIX matTranslation;
D3DXMATRIX matScaling;
D3DXMATRIX matTransform;
D3DXMatrixScaling(&matScaling, (float)m_Width, (float)m_Height, 1.0f);
D3DXMatrixTranslation(&matTranslation, (float)x, (float)y, 0.0f);
matTransform = matScaling * matTranslation;
pGameService->GetD3DDevice()->SetTransform(D3DTS_WORLD, &matTransform);
pGameService->GetD3DDevice()->SetTexture(0, m_pTexture);
pGameService->GetD3DDevice()->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
}
Ein Programmierfreund sagt es ist blöd für jedes objekt immer ein renderaufruf zu machen. stimmt das? er sagt ich soll den vertexbuffer locken die ganze koordinaten reinschreiben und dann ein renderaufruf machen. aber ich versteh das nich ganz? was ist jetzt der richtige weg? und kann man die texturkoordinaten u, v auch mit matrizen ändern oder nur durch locken des vertexbuffers?
lg Tibo
Also ich verwende DirectX9 für mein neues 2d game projekt. Erstmal hab ich die VertexBuffer locken - koordinaten ändern - vertexbuffer unlocken gelernt. hab dann gelesen dass das recht langsam ist. dann bin ich auf matrizen umgestiegen mit ner Ortho Matrix:
D3DXMatrixOrthoOffCenterLH(&matOrtho, 0, 800, 600, 0, 1.0f, 10.0f);
m_lpD3DDevice->SetTransform(D3DTS_PROJECTION, &matOrtho);
m_lpD3DDevice->SetTransform(D3DTS_WORLD, &matIdentity);
m_lpD3DDevice->SetTransform(D3DTS_VIEW, &matIdentity);
ok dann meine Sprite klasse die SetupQuad methode die ruf ich beim initialisieren EINMAL auf und beweg sie dann mit matrizen und zwar in der funktion Blit:
void Sprite::SetupQuad()
{
pGameService->GetD3DDevice()->CreateVertexBuffer(sizeof(GameService::VERTEX) * 6, NULL, pGameService->GetVertexFormat(), D3DPOOL_MANAGED, &m_pVertexBuffer, NULL);
m_pVertices = NULL;
m_pVertexBuffer->Lock(0, 6 * (sizeof(GameService::VERTEX)), (void**)(&m_pVertices), 0);
m_pVertices[0].color = 0xffffffff;
m_pVertices[0].x = 0.0f;
m_pVertices[0].y = 0.0f;
m_pVertices[0].z = 1.0f;
m_pVertices[0].u = 0.0f;
m_pVertices[0].v = 0.0f;
m_pVertices[1].color = 0xffffffff;
m_pVertices[1].x = 1.0f;
m_pVertices[1].y = 0.0f;
m_pVertices[1].z = 1.0f;
m_pVertices[1].u = 1.0f;
m_pVertices[1].v = 0.0f;
m_pVertices[2].color = 0xffffffff;
m_pVertices[2].x = 1.0f;
m_pVertices[2].y = 1.0f;
m_pVertices[2].z = 1.0f;
m_pVertices[2].u = 1.0f;
m_pVertices[2].v = 1.0f;
m_pVertices[3].color = 0xffffffff;
m_pVertices[3].x = 1.0f;
m_pVertices[3].y = 1.0f;
m_pVertices[3].z = 1.0f;
m_pVertices[3].u = 1.0f;
m_pVertices[3].v = 1.0f;
m_pVertices[4].color = 0xffffffff;
m_pVertices[4].x = 0.0f;
m_pVertices[4].y = 1.0f;
m_pVertices[4].z = 1.0f;
m_pVertices[4].u = 0.0f;
m_pVertices[4].v = 1.0f;
m_pVertices[5].color = 0xffffffff;
m_pVertices[5].x = 0.0f;
m_pVertices[5].y = 0.0f;
m_pVertices[5].z = 1.0f;
m_pVertices[5].u = 0.0f;
m_pVertices[5].v = 0.0f;
m_pVertexBuffer->Unlock();
pGameService->GetD3DDevice()->SetStreamSource(0, m_pVertexBuffer, 0, sizeof(GameService::VERTEX));
}
void Sprite::Blit(int x, int y)
{
D3DXMATRIX matTranslation;
D3DXMATRIX matScaling;
D3DXMATRIX matTransform;
D3DXMatrixScaling(&matScaling, (float)m_Width, (float)m_Height, 1.0f);
D3DXMatrixTranslation(&matTranslation, (float)x, (float)y, 0.0f);
matTransform = matScaling * matTranslation;
pGameService->GetD3DDevice()->SetTransform(D3DTS_WORLD, &matTransform);
pGameService->GetD3DDevice()->SetTexture(0, m_pTexture);
pGameService->GetD3DDevice()->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);
}
Ein Programmierfreund sagt es ist blöd für jedes objekt immer ein renderaufruf zu machen. stimmt das? er sagt ich soll den vertexbuffer locken die ganze koordinaten reinschreiben und dann ein renderaufruf machen. aber ich versteh das nich ganz? was ist jetzt der richtige weg? und kann man die texturkoordinaten u, v auch mit matrizen ändern oder nur durch locken des vertexbuffers?
lg Tibo