2012-03-29 7 views
1

Beim Versuch, eine Linie im 3D-Raum mit D3DPT_LINELIST zu zeichnen, gibt Direct3D mir einen Fehler über eine ungültige Eckpunktdeklaration und sagt, dass es nicht in FVF konvertiert werden kann. Ich benutze die gleiche Vertex-Deklaration und Shader/Stream-Konfiguration wie für meine D3DPT_TRIANGLELIST Wiedergabe, die absolut korrekt funktioniert.Verwenden von D3DPT_LINELIST zum Rendern von 3D-Linien

Wie kann ich D3DPT_LINELIST verwenden, um einige Linien im 3D-Raum zu rendern?

Hier ist meine Roh Draw Call.

D3DCALL(device->SetVertexDeclaration(VertexDecl)); 
D3DCALL(device->SetStreamSource(1, PerBoneBuffer.get(), 0, sizeof(PerInstanceData))); 
D3DCALL(device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA | 1)); 
D3DCALL(device->SetStreamSource(0, LineVerts, 0, sizeof(D3DXVECTOR3))); 
D3DCALL(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | lines.size())); 
D3DCALL(device->SetIndices(LineIndices)); 
PerInstanceData* data; 
std::vector<Wide::Render::Line*> lines_vec(lines.begin(), lines.end()); 
D3DCALL(PerBoneBuffer->Lock(0, lines.size() * sizeof(PerInstanceData), reinterpret_cast<void**>(&data), D3DLOCK_DISCARD)); 
std::for_each(lines.begin(), lines.end(), [&](Wide::Render::Line* ptr) { 
    data->Color = D3DXColor(ptr->Colour); 
    D3DXMATRIXA16 Translate, Scale, Rotate; 
    D3DXMatrixTranslation(&Translate, ptr->Start.x, ptr->Start.y, ptr->Start.z); 
    D3DXMatrixScaling(&Scale, ptr->Scale, 1, 1); 
    D3DXMatrixRotationQuaternion(&Rotate, &D3DQuaternion(ptr->Rotation)); 
    data->World = Scale * Rotate * Translate; 
}); 
D3DCALL(PerBoneBuffer->Unlock()); 
D3DCALL(device->DrawIndexedPrimitive(D3DPRIMITIVETYPE::D3DPT_LINELIST, 0, 0, 2, 0, 1)); 

Hier ist meine Vertex Erklärung:

D3DVERTEXELEMENT9 BasicMeshVertices[] = { 
    {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0}, 
    {1, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0}, 
    {1, 16, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1}, 
    {1, 32, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 2}, 
    {1, 48, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 3}, 
    {1, 64, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0}, 
    D3DDECL_END() 
}; 
D3DCALL(Device->CreateVertexDeclaration(
    BasicMeshVertices, 
    PointerToPointer(BasicMeshVertexDecl) 
)); 

Die LineIndices sind nur 0, 1 und die LineVerts sind nur {0,0,0} und {1,0,0}, eine Einheit 3D-Linie entlang der X-Achse darzustellen.

+0

Können Sie Ihren Code veröffentlichen, der CreateVertexDeclaration(), SetVertexDeclaration() und den relevanten Vertex-Shader-Code aufruft? – Asaf

+0

@Asaf: Gimme eine Sekunde, um diese bestimmten Stücke zu finden. – Puppy

Antwort

2

Ich bin mir nicht sicher, ob Sie tatsächlich einen Vertex-Shader verwenden (habe keinen Code dafür gesehen - ist es eine feste Pipeline?). Ich weiß nicht, was den Unterschied zwischen Dreiecken und einer Linienliste verursachen könnte, aber der Fehler, den Sie bekommen, bedeutet, dass Ihre Eckpunktdeklaration nicht in den älteren FVF konvertiert werden kann.

Von here (Seite 177 - 5.8.1: Festfunktionsdeklarationen):

Wenn die fi mit fixiert-Funktions-Pipeline mit einem Scheitelpunkt Erklärung, die entsprechenden Vertex-Komponenten müssen jeweils auf eine bestimmte Nutzung zugeordnet werden . Sie können mehrere Streams verwenden, die Scheitelpunkte müssen jedoch den Einschränkungen für Reihenfolge und Typ der in Abschnitt 5.7 beschriebenen FVF-Codes entsprechen.

Und aus dem Abschnitt 5.7:

Die Scheitel Komponenten im Speicher angelegt werden in der gleichen Reihenfolge wie die Scheitelpunkt-Komponenten in der Tabelle aufgeführt ist, beginnend mit dem Positionskomponente.

Die Tabelle ist einfach die Liste der D3DFVF_* Konstanten aus den Header-Dateien.

Also in Ihrem Fall - versuchen Sie, die Farbkomponente vor der Tex-Coords-Komponenten in der PerInstanceData (Stream 1) -Struktur zu bewegen.

+0

Ich benutze einen Shader, eigentlich ... aber wie Sie richtig darauf hinweisen, ist es nicht zum Zeitpunkt der Zeichnung auf das Gerät eingestellt, was wahrscheinlich der Fehler in Frage ist. Gib mir ein paar Stunden Zeit, um es zu testen, und ich melde mich zurück. – Puppy

Verwandte Themen