Sprite direkt auf eine D3D Oberfläche malen ?



  • Ist es möglich, dass man mit einem D3D Backbuffer Folgendes tut:
    (Bei meinem Uebe-Programm soll der Raum in viele kleine Würfel zerteilt werden, und jeder Würfel enthält z.B. mindestens eine Bodentextur sowie - maximal - ENTWEDER ein nicht nicht-animiertes Modell (also 'echte' 3D-Geometrie) ODER einen Zeiger auf ein animiertes (2D-) Sprite.)
    Die Szene kann dann verhältnismäßig einfach von 'hinten nach vorne' (aus der Sicht der Kamera) und Würfel- für Würfel gezeichnet werden.
    Der Abstand/Orientierung der Kamera zur Szene soll stets konstant sein.

    Ich bin mir leider nicht sicher, wie bzw. ob man das mit einer D3D Oberfläche prinzipiell machen kann:

    Zuerst werden z.B. jene Raum-Würfel, die (in die z-Richtung) relativ weit weg von der Kamera sind mittels DrawPrimitive gemalt. (Sowie auch allfällige 'Echte' 3D Objekte, die auf so einem Raum-Würfel vorkommen können).
    Auf halber Länge (auf dem Weg von 'weit hinten' nach 'weit vorne' kommt dann ein Würfel vor mit Zeiger auf 2D-Sprite (mit Alpha-Kanal). Weil die Kamera immer konstant weit weg ist, sind immer gleich viele Würfel zu sehen, und die Bildschirmposition, wo das hingeblittet werden soll, ist relativ leicht berechenbar. Und nach dem Blit von dem 2D-Sprite soll D3D dann aber wieder (bis nach 'vorne') 'Echte' 3D Würfel / Kacheln mit den entsprechenden Funktionen malen (und dabei auch Teile des Sprites wieder übermalen, falls es notwendig ist, weil z.B. ein Baum teilweise bzw. ganz davor steht).

    Ist also folgendes möglich:
    (1) BeginScene
    (2) DrawPrimitive
    (3) Alpha-Blit (auf die gleiche Oberläche, auf die DrawPrimitive malt)
    (4) DrawPrimitive
    (5) EndScene
    (6) Present()

    -> Ich erhoffe mir davon letztendlich eine Vereinfachung komplizierter Animationen, die ich dann Bild für Bild von einem entsprechenden Programm (c4d z.B.) vorausberechnen könnte, weil ich mir nicht vorstellen kann, dass ein Mesh mit sehr vielen Polygonen in Echtzeit und womöglich 25 x pro Sekunde sonst so ohne weiteres animierbar ist. Mit einer derartigen Compositing-Ähnlichen Vorgangsweise entfiele die Notwendigkeit von haarsträubend vielen Transformationen bzw. des Anlegens extremst speicherhungriger Morph-Versionen desselben Modells. Bin mir leider nicht sicher, ob man so ohne Weiteres ein Sprite auf eine D3D Oberfläche malen darf/kann.



  • also der Beitrag ist zwar schon ewig her, aber ich versuche trotzdem mal eine Antwort auf das Thema zugeben, da ich grad an einer äquivalenten Sache arbeite,
    vielleicht als Hilfe für jene, die auch noch auf das problem treffen.

    Ich hoffe ich habe die Fragestellung richtig interpretiert, ich nehme an, Du möchtest 3d - Zeichnen, dann 2d ( sprites ) und dann wieder 3d.

    Ich habe das wie folgt gelöst.

    gDevice sei mein grafik-device
    gSprite ist der sprite device

    Ich habe das ganze System dann in Layern angelegt, also wie folgt
    erstmal 3d gerendert, dann sprites, dann wieder 3d

    // Licht an
    gDevice->SetRenderState(D3DRS_LIGHTING, TRUE);
    
    // scene starten
    g_lpDevice->BeginScene();
    
    //3d meshes rendern
    
    //sprite scene starten
    gSprite->Begin(D3DXSPRITE_ALPHABLEND);
    
    //sprites zeichnen
    
    //spritescene beenden
    g_lpSprite->End();
    
    //jetz könnte man quasi problemlos, eine weitere schicht 3d darüber legen und 
    //immer so weiter, wichtig ist nur, das nach dem spritezeichnen der z-buffer 
    //gecleart ( omg, denglisch ^^ ) wird.
    
    gDevice->Clear(0, NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    
    //renderstates setzen und rendern, spaß haben :)
    
    //irgendwann die scene beenden
    
    // Bild ist fertig...
    gDevice->EndScene();
    
    // Bild darstellen
    gDevice->Present(NULL,NULL,0,NULL);
    

    so ich hoffe das hilft weiter, und ich hoffe auch mir sind keine Fehler unterlaufen.

    mfg
    el_presidente

    edit: mir ist noch was eingefallen, natürlich musst Du beachten, die Koordinaten umzurechnen, bzw die camera anzupassen. nicht das Du dich wunderst warum Dein Sprite nicht auftaucht 😉


Anmelden zum Antworten