0

これまでにDirectX9でフレームワークを作成しました。これは、ロードするすべてのテクスチャを描画する単一のVertexBufferを使用し、LockandUnlock呼び出し内のすべての単一のTextureQuadを描画する1つの頂点配列を使用しました。バッチ処理と呼ばれるものがあり、一度ロックするとすべてを描画するときにロックを解除できると聞きました。ロックとロック解除を1回の呼び出しですべてのテクスチャクワッドを描画できることは知っていますが、これらのそれぞれに異なるテクスチャを設定する方法がわかりません。ここの誰かが私を導くことができますか?

vertexBufferRHW->Lock(0, 0, (void**)&VerticesRHW, NULL);

VerticesRHW[0].Color = color;
VerticesRHW[0].X = (float) Position.X;
VerticesRHW[0].Y = (float) Position.Y;
VerticesRHW[0].Z = 0.0f;
VerticesRHW[0].RHW = 1.0f;
VerticesRHW[0].U = 0.0f;
VerticesRHW[0].V = 0.0f;

VerticesRHW[1].Color = color;
VerticesRHW[1].X = (float) (Position.X+TextureFile.Width);
VerticesRHW[1].Y = (float) Position.Y;
VerticesRHW[1].Z = 0.0f;
VerticesRHW[1].RHW = 1.0f;
VerticesRHW[1].U = 1.0f;
VerticesRHW[1].V = 0.0f;

VerticesRHW[2].Color = color;
VerticesRHW[2].X = (float) (Position.X+TextureFile.Width);
VerticesRHW[2].Y = (float) (Position.Y+TextureFile.Height);
VerticesRHW[2].Z = 0.0f;
VerticesRHW[2].RHW = 1.0f;
VerticesRHW[2].U = 1.0f;
VerticesRHW[2].V = 1.0f;

VerticesRHW[3].Color = color;
VerticesRHW[3].X = (float) Position.X ;
VerticesRHW[3].Y = (float) (Position.Y+TextureFile.Height);
VerticesRHW[3].Z = 0.0f;
VerticesRHW[3].RHW = 1.0f;
VerticesRHW[3].U = 0.0f;
VerticesRHW[3].V = 1.0f;

vertexBufferRHW->Unlock();

spriteDevice->SetTexture(0,TextureFile.TextureFile);
spriteDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
4

1 に答える 1

0

すべてのクワッドの高さ/幅を 1 にしてから、次のように for ループを実行できます。

for( ... loop through all the textures )
{
    // create a matrix that scales your quad to make it the correct width/height and in the correct location
    D3DXMATRIX matrix, scale, translation;
    D3DXMatrixScaling( &scale, texture.width, texture.height, 0 );
    D3DXMatrixTranslation( &translation, position.x, position.y, 0 );
    matrix = scale * translation;
    spriteDevice->SetTransform( D3DTS_WORLDMATRIX, &matrix ); 
    spriteDevice->SetTexture(0,texture);
    spriteDevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
}
于 2013-02-22T19:12:36.590 に答える