[DirectX 11] Bufor wierzchołków a aktualizowanie pozycji wierzchołków
Ostatnio zmodyfikowano 2014-12-28 13:40
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ę: void EngineWindow::CreateVertexBuffer() { HRESULT HR; 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ć? |
|
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.htmlKod 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. |
|
Wicon Temat założony przez niniejszego użytkownika |
» 2014-12-28 13:40:42 Bardzo dziękuję za pomoc. Pozdrawiam. :) |
|
« 1 » |