Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[DirectX 11] Bufor wierzchołków a aktualizowanie pozycji wierzchołków

Ostatnio zmodyfikowano 2014-12-28 13:40
Autor Wiadomość
Wicon
Temat założony przez niniejszego użytkownika
[DirectX 11] Bufor wierzchołków a aktualizowanie pozycji wierzchołków
» 2014-12-27 23:32:34
Witam. Mam trochę wątpliwości co do niniejszego tematu. Mianowicie, utworzyłem bufor wierzchołków, ale za żadne skarby świata nie mogę poradzić sobie z aktualizacją pozycji wierzchołków w buforze. Próbowałem wielu rzeczy i 1 sposób zadziałał, ale podejrzewam, że jest on bardzo niewydajny. Mianowicie tworzę bufor wierzchołków na nowo z każdą klatką.
Znaczy się, wywołuję tą funkcję, co klatkę:
C/C++
void EngineWindow::CreateVertexBuffer()
{
    HRESULT HR;
    /*EDIT*/ if( VertexBuffer ) VertexBuffer->Release();
   
    Vertex * VertIndicator;
    if( NumberOfVertex != 0 )
    {
        VertIndicator = new Vertex[ NumberOfVertex ];
        DWORD Iter_NumberOfVertex = 0;
        while( Iter_NumberOfVertex < NumberOfVertex )
        {
            VertIndicator[ Iter_NumberOfVertex ].x = AllVertex[ Iter_NumberOfVertex ].x;
            VertIndicator[ Iter_NumberOfVertex ].y = AllVertex[ Iter_NumberOfVertex ].y;
            VertIndicator[ Iter_NumberOfVertex ].z = AllVertex[ Iter_NumberOfVertex ].z;
            Iter_NumberOfVertex++;
        };
    };
   
    D3D11_BUFFER_DESC Buffer_Desc;
    ZeroMemory( & Buffer_Desc, sizeof( Buffer_Desc ) );
    Buffer_Desc.Usage = D3D11_USAGE_DEFAULT;
    Buffer_Desc.ByteWidth = sizeof( Vertex ) * NumberOfVertex;
    Buffer_Desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    Buffer_Desc.MiscFlags = 0;
    Buffer_Desc.CPUAccessFlags = 0;
    ZeroMemory( & InitData, sizeof( InitData ) );
    if( NumberOfVertex != 0 ) InitData.pSysMem = VertIndicator;
   
    HR = D3DDevice->CreateBuffer( & Buffer_Desc, & InitData, & VertexBuffer );
    if( FAILED( HR ) ) { if( NumberOfVertex != 0 ) MessageBox( NULL, "Nie można utworzyć bufora wierzchołków", "Niepowodzenie utworzenia bufora wierzchołków", MB_ICONEXCLAMATION | MB_OK ); };
    UINT Stride = sizeof( Vertex );
    UINT Offset = 0;
    DeviceContext->IASetVertexBuffers( 0, 1, & VertexBuffer, & Stride, & Offset );
   
    DeviceContext->IASetPrimitiveTopology( D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST );
    if( NumberOfVertex != 0 ) delete[] VertIndicator;
   
};
Gdzie AllVertex to vector z danymi o wierzchołkach. Działa, ale widzę, że chyba to jest bez sensu, aby trzymać te dane 2 razy i jak się nie mylę to w dodatku z każdą klatką przesyłam dane z pamięci operacyjnej do pamięci grafiki, co jest mało wydajne.
Myślałem, nad uzyskaniem wskaźnika do tych danych w buforze, ale jak go uzyskać również nie mam pojęcia.
Moje pytanie brzmi: W jaki sposób modyfikować pozycję wierzchołków? Jak dostać się do danych w buforze i je wydajnie modyfikować?
P-123409
DejaVu
» 2014-12-28 13:28:28
Załaduj bufor wierzchołków do GPU tak jak robisz, a potem shaderami modyfikuj położenie wierzchołków. Przypuszczam, że jakieś animacje chcesz robić. Ja obecnie też walczę z animacjami i np. jest kurs oraz przykłady z kodami źródłowymi, prezentujący animowanie modeli 3D.

Patrz: http://ogldev.atspace.co.uk​/www/tutorial38/tutorial38.html

Kod jest co prawda dla OpenGL-a i biblioteki Assimp, ale jak pogrzebiesz w tych źródłach to zapewne znajdziesz odpowiedź na swoje pytania.

Druga opcja: poszukaj kursu OpenGL-a bądź DirectX-a, poświęconego wydajnym animacjom 3D. Zapewne natrafisz na rozdziały poświęcone shaderom.
P-123435
Wicon
Temat założony przez niniejszego użytkownika
» 2014-12-28 13:40:42
Bardzo dziękuję za pomoc. Pozdrawiam. :)
P-123437
« 1 »
  Strona 1 z 1