Kugel nicht als TriangleList Renderbar

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
gamer1208
Beiträge: 5
Registriert: 26.01.2011, 09:54

Kugel nicht als TriangleList Renderbar

Beitrag von gamer1208 »

Tag zusammen,

Ich bin gerade dabei meinen ASSIMP Parser fertigzustellen. Habe gerade mal zum testen zwei Würfel aus Maya exportiert und Rendern lassen. Funktioniert alles ganz gut soweit.Als weiteren Test, in Maya drei übereinander liegende Kugeln modelliert und exportiert. Es wird nichts gerendert.
Vertex und Index Buffer werden korrekt befüllt. Nachdem ich den Primitiven Typ von Trianglelist zu TriangleFan oder TriangleStrip änder werden meine Kugeln korrekt gerendert.

Das sind meine Renderstates:

manager.DeviceInterface->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
manager.DeviceInterface->SetRenderState(D3DRS_LIGHTING, false);
manager.DeviceInterface->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
manager.DeviceInterface->SetRenderState(D3DRS_DITHERENABLE, true);

Meine DrawIndexedPrimitive Methode:

// Draw the mesh
manager.DeviceInterface->DrawIndexedPrimitive(
type,
0,
0,
GetNumberOfVertizes(),
0,
GetNumberOfFaces() / 3);

Ist das normal das Kugeln nur so gerendert werden ? Wenn ja warum ? Wenn es nicht normal ist hat vllt. jemand von euch eine Lösung bzw. die Ursache für dieses Verhalten


Vielen Dank vorab..

Gruß gamer1208
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Kugel nicht als TriangleList Renderbar

Beitrag von Schrompf »

Warum NumFaces durch 3? Lass das /3 weg.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
gamer1208
Beiträge: 5
Registriert: 26.01.2011, 09:54

Re: Kugel nicht als TriangleList Renderbar

Beitrag von gamer1208 »

Okay. Kann das erst wieder heute abend testen. Vllt. noch eine kurze Erklärung warum nicht "/ 3" ?

Vielen Dank jedenfalls schonmal.

Gruß gamer1208
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Kugel nicht als TriangleList Renderbar

Beitrag von Zudomon »

Weil der letzte Parameter der Primitive-Count ist...
Bei einer Trianglelist entspricht dies der Anzahl von Dreiecken in der Liste...
GetNumberOfFaces() hört sich so an, als ob da nicht die Anzahl der Vertices, sondern der Dreiecke zurückgegeben wird...
Wäre es die Anzahl der Vertices, dann wäre "/3" durchaus richtig.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4884
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Kugel nicht als TriangleList Renderbar

Beitrag von Schrompf »

Nein, auch dann nicht :-) Anzahl Indizes durch 3 wäre korrekt. Vertizes können mehrfach indiziert werden, der VertexCount ist also kein Maßstab für die Primitive-Anzahl.

In Langform: Mit "Primitives" meint Direct3D die Grundformen, die Du zeichnen willst. Also Dreiecke, Linien oder Punkte. Triangle Strips und Fans sind veraltet, lass die besser in Ruhe, solange Du nocht nicht genau verstanden hast, wie die sich zusammensetzen. Du willst, wenn Du Assimp-Modelle laden willst, eigentlich immer Dreiecke zeichnen.

Wieviele Dreiecke willst Du also zeichnen? Assimp kennt Faces. Faces können Dreiecke sein, wenn sie 3 Ecken haben - logisch, oder? :-) Es kann allerdings auch Faces mit != 3 Ecken geben. Faces mit mNumIndices == 2 wären z.B. Linien - ein Start- und ein Endpunkt. Faces mit >3 Ecken wären Polygone. Die kannst Du nicht direkt an die Grafikkarte geben, weil die nur mit Dreiecken umgehen kann. Man kann aber Polygone in Dreiecke zerlegen - aiProcess_Triangulate tut das für Dich. Und der ist recht clever, dank Aramis kann der auch konkave oder anderweitig böse verbeulte Polygone noch in korrekte Dreiecke zerlegen. Das alles wird für dich schon automatisch erledigt, wenn Du das beim Import angibst. Du musst dann nur noch durch das Face-Array, evtl. Faces mit <3 Ecken rauswerfen und die Indizes der restlichen Faces in einen IndexBuffer umladen. Danach kannst Du diesen IndexBuffer direkt zum Rendern verwenden - mit aiMesh::mNumFaces als PrimitiveCount, falls Du keine Linien vorher aussortiert hast. Sonst musst Du halt selber zählen, wieviele Faces mit aiFace::mNumIndices==3 es gibt.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
gamer1208
Beiträge: 5
Registriert: 26.01.2011, 09:54

Re: Kugel nicht als TriangleList Renderbar

Beitrag von gamer1208 »

Ausgezeichnet. Vielen Dank euch beiden. Damit macht das ganze Sinn und ich habe es endlich gerafft. Vllt. war für mich der Begriff Faces einfach nicht ganz klar. ;-)

Schon krass wie lange ich mich mit diesem einem sch*** Parameter aufgehalten habe ^^.

Gruß -gamer1208-
Benutzeravatar
Zudomon
Establishment
Beiträge: 2257
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: Kugel nicht als TriangleList Renderbar

Beitrag von Zudomon »

Schrompf hat geschrieben:Nein, auch dann nicht :-) Anzahl Indizes durch 3 wäre korrekt. Vertizes können mehrfach indiziert werden, der VertexCount ist also kein Maßstab für die Primitive-Anzahl.
Schon klar... habe mich wohl etwas schwammig ausgedrückt...
Antworten