Napsal jsem si vlastní fci pro vykreslování texturovaných obdélníků. Fce pokaždé, když se zavolá, tak uzamkne vertex-buffer, naplní ho daty, odemkne a vykreslí obdélník v něm uložený. Nevim jestli, je dostatečně výkoné, když se v každém snímku několikrát uzamkne, naplní a odemkne vertexbuffer (pro každý objekt jednou), nebo jestli je lepší udělat vertexbuffer větší - pro všechny objekty jeden společný (na úkor složitosti a menší universálnosti kódu), tak aby se v každém snímku zamykal a odemykal pouze jednou.
vertex format:
D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1
kód fce:
void DrawQuadEx(LPRECT pSrcRect, LPRECT pTarRect, LPDIRECT3DTEXTURE9 pTexture, D3DXCOLOR color = 0xFFFFFFFF){
//pSrcRect - ukazatel na vyrez textury, ktery se ma vykreslit
//pTarRect - ukazatel na RECT s informacemi a rozmery vysledneho obdelniku na obrazovce
//pTexture - ukazatel na texturu kterou ma byt pokryt obdelnik
//color - barva obdelniku
D3DSURFACE_DESC surfaceDesc;
pTexture->GetLevelDesc(0, &surfaceDesc);
CUSTOMVERTEX *vertices;
g_pVertexBuffer->Lock(0, sizeof(CUSTOMVERTEX), (void**)&vertices, NULL);
vertices[0].x = (float)pTarRect->left - 0.5f;
vertices[0].y = (float)pTarRect->top - 0.5f;
vertices[0].z = 0.0f;
vertices[0].rhw = 1.0f;
vertices[0].color = color;
vertices[0].u = (float)pSrcRect->left/surfaceDesc.Width;
vertices[0].v = (float)pSrcRect->top/surfaceDesc.Height;
vertices[1].x = (float)pTarRect->right - 0.5f;
vertices[1].y = (float)pTarRect->top - 0.5f;
vertices[1].z = 0.0f;
vertices[1].rhw = 1.0f;
vertices[1].color = color;
vertices[1].u = (float)pSrcRect->right/surfaceDesc.Width;
vertices[1].v = (float)pSrcRect->top/surfaceDesc.Height;
vertices[2].x = (float)pTarRect->right - 0.5f;
vertices[2].y = (float)pTarRect->bottom - 0.5f;
vertices[2].z = 0.0f;
vertices[2].rhw = 1.0f;
vertices[2].color = color;
vertices[2].u = (float)pSrcRect->right/surfaceDesc.Width;
vertices[2].v = (float)pSrcRect->bottom/surfaceDesc.Height;
vertices[3].x = (float)pTarRect->left - 0.5f;
vertices[3].y = (float)pTarRect->bottom - 0.5f;
vertices[3].z = 0.0f;
vertices[3].rhw = 1.0f;
vertices[3].color = color;
vertices[3].u = (float)pSrcRect->left/surfaceDesc.Width;
vertices[3].v = (float)pSrcRect->bottom/surfaceDesc.Height;
g_pVertexBuffer->Unlock();
g_pD3DDev->SetTexture(0, pTexture);
g_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
}
Je to takhle v pohodě, nebo by byl jeden velký vertex buffer (kam by se vešly všechny objekty hry) nějak znatelně výkonější?