Primitives ausgeben
-
Hi!
Ich habe zwei PointArrays. In einem sind Punkte für Linien und im anderen
Punkte für ausgefüllte Dreiecke.
Das ganze möchte ich mit DirectX ausgeben.
Wenn ich das ganze jeweils separat mache also mit eigenem Buffer usw. funktionierts. Aber man soll ja möglichst selten den Befehl BeginScene verwenden oder?Kann mir jemand sagen wo bei mir wahrscheinlich der Fehler liegt?
Grüße
Huddim_pd3dDevice->CreateVertexBuffer( 10000*sizeof(Point) + 12*sizeof(Point), /*D3DUSAGE_DONOTCLIP | */D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, POINT_FLAGS, D3DPOOL_DEFAULT, &D3DVertexBuffer); VOID *pBuffer = NULL; if (FAILED (D3DVertexBuffer->Lock(0, sizeof(lineList) + sizeof(TriangleList), (BYTE **)&pBuffer, D3DLOCK_DISCARD | D3DLOCK_NOSYSLOCK) ) ) {return S_FALSE; } memcpy(pBuffer, lineList, sizeof(lineList)); memcpy((void*)((int)pBuffer+sizeof(lineList)), TriangleList, sizeof(TriangleList)); if ( FAILED ( D3DVertexBuffer->Unlock() ) ) {return S_FALSE; } if( SUCCEEDED( m_pd3dDevice->BeginScene() ) ) { m_pd3dDevice->SetStreamSource(0, D3DVertexBuffer, sizeof(Point)); m_pd3dDevice->SetVertexShader( POINT_FLAGS ); m_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 5000 ); m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4); m_pd3dDevice->EndScene(); }
-
m_pd3dDevice->DrawPrimitive(D3DPT_LINELIST, 0, 5000 ); m_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, [b]0[/b], 4);
Aus der Doku:
HRESULT DrawPrimitive( D3DPRIMITIVETYPE PrimitiveType, [b]UINT StartVertex[/b], UINT PrimitiveCount );
Also startest du beim Dreieck zeichnen mit dem Startvertex der Linien.
Die Informationen für die Dreiecke sind jedoch hinter den der Linien.
Hoffe das konnte helfen.
Ansonsten schau in der Doku mal nach "Rendering from Vertex and Index Buffers"
Da ist alles nochmal erklärt.
-
ahh, vielen Dank!
Das mit den Typenumwandlungen in memcopy passt aber soweit?
-
huddi schrieb:
Das mit den Typenumwandlungen in memcopy passt aber soweit?
Adressen auf "int" zu casten ist in Hinblick auf 64 Bit nicht sinnvoll.
Nimm lieber einen Zeigertyp dessen Elementgroesse 1 ist.
Zumal die Api an der Stelle ja auch BYTE* vorsieht...