Scene Graph Rendering Frage1
-
Hallo Leute,
ich hab mir einen Szenengraphen programmiert.. Ganz simpel mit Nodes (Gruppen- und Geometry- Nodes).
Jeder Node hat seine Transformationen welche rekrusive druch den scenen graphen erechnent werden, und dargestellt werden!
Das ganz funktioniert soweit auch, nun aber ne frage! Ich verwende DirectX (SlimDX c# Wrapper).
Die einzelnen Geomertrien sind bisher "Meshes" welche ich über "DrawSubMesh" zeichne, und zuvor die entsprechen erechente gesamt Transformation.
Nun denke das die Reihenfolge der Geometry Renderungen entsrpechend der Z-Order wichtig sind oder???? Ein Render-Call iteriert ja meinen Scenengraph und zeichnet die Meshes.. aber je nach dem wie die meshes in der Z-Order im Viewport stehen muss man die ensprechen nacheinander rendern oder??? Mir is aufgefallen das manche Objekte nur so halb gerendet werden und einfach irgendwie abgeschnitten werden!?
wie erreich ich das?
-
Oder hat das was mit dem ZBuffer zu tun???
Das Gerät wird so initalisiert:
d3d = new Direct3D(); PresentParameters pp = new PresentParameters(); pp.SwapEffect = SwapEffect.Flip; pp.DeviceWindowHandle = Handle; pp.Windowed = true; pp.BackBufferWidth = ClientSize.Width; pp.BackBufferHeight = ClientSize.Height; pp.BackBufferFormat = Format.A8R8G8B8; device = new Device( d3d, 0, DeviceType.Hardware, //NullReference => Remote Desktop Handle, CreateFlags.HardwareVertexProcessing, pp );
und der Rendercall sieht so aus:
this.device.Clear(ClearFlags.Target, new Color4(Color.Black), 1f, 0); this.device.Clear(ClearFlags.ZBuffer, 0/, 1f, 0); this.device.BeginScene(); StateBlock block = new StateBlock(this.device, StateBlockType.All); block.Capture(); _sceneGraph.Render(); block.Apply(); block.Dispose(); this.device.EndScene(); this.device.Present();
is das korrekt so, oder muss ich die objekte die ich einzeln renderere "DrawSubMesh" in korrekter z-Reihenfolge zeichnen?
-
Ich kann jetzt nur von OpenGL sprechen, aber das prinzip sollte auch bei DX gelten. In GL regelt man das über glEnable(GL_DEPTH_TEST) und durch setzen der speziellen func der den depth test configuriert. Vielleicht hilft dir das auch weiter sollange kein dx Spezi kongreter werden kann.
Aber relevant bleibt deine Frage irgendwie auch dann noch, du kannst dir natürlich das rendern von verdeckten Objekten sparen.
-
Gelöscht. Forum macht komische sachen bei mir..
-
@BorisDieKlinge:
Sortieren musst du nur Dinge die "(halb)durchsichtig" sind. Also überall wo du nen speziellen Shader drauf hast, der die Werte die aktuell im Render-Target stehen verwendet, oder halt ganz einfach Alpha-Blending machst.Andere Dinge müssen nicht sortiert werden, wenn du mit Z-Buffer renderst.
-
Wenn du den Z-Buffer verwenden willst must du das DirectX mitteilen, indem du bei den PresentParametern noch das einfügst:
pp.EnableAutoDepthStencil = true; pp.AutoDepthStencilFormat = DepthFormat.D16;
Das Format müsstest du evtl noch anpassen.
Es kann aber auch sein das dein Cullmode nicht richtig ist und deine Polygone nur in einem Drehsinn(Einseitig) gerendert werden. Den Cullmode findest du beim device.Renderstates, stelle ihn auf NONE, falls du nicht weis welcher richtig ist.
-
huhu,
@Husbaer: Danke für den Tip, bisher verwende ich keine transparenz etc.
@JaykopX: Jetzt sieht es schon bischen besser aus. (Allterding flackern die Farben, hat as was mit den materialen ode Lights zu tun)
-
Naja "flackernde Farben" ist ein bischen zu allgemein. Desshalb rate ich hier mal:
1. Du hast Polygone die SEHR dicht beieinander sind und desshalb mal das eine und mal das andere Polygon gerender wird(Clipping Fehler), dann musst du die verticies oder meshes weiter auseinader ziehen.
oder
2. Du rufst Clear zum falschen Zeitpunkt oder mit falschen Paramtern auf, so wie es jetzt aussieht scheinst du den Backbuffer(vieleicht mit absicht?) nicht zu clearen.
oder
3. Deine Projekttionsmatrix hat eine zu kleine "Sichtweite", dann würden allerdings ganze Teile weggeschnitten und kein flackern auftreten.
oder
4. Die Vertexnormalen von den Meshes sind nicht sinnvoll gestaltet, dann kann es sein, dass Polygone im einem Moment alles reflektieren und im nächsten Moment alles Licht absorbieren, was wie ein flackern wirkt.Für genaueres gibt's zuwenig Code
-
Hallo JaykopX,
danke für deine Hilfe.. ich hab bischen rumprobiert und es liegt wohl an
3. Deine Projekttionsmatrix hat eine zu kleine "Sichtweite", dann würden allerdings ganze Teile weggeschnitten und kein flackern auftreten.
oder
4. Die Vertexnormalen von den Meshes sind nicht sinnvoll gestaltet, dann kann es sein, dass Polygone im einem Moment alles reflektieren und im nächsten Moment alles Licht absorbieren, was wie ein flackern wirkt.Ich erzeuge ein Würfel mit "CreateBox" und zeichne diesen.. allesding sieht es so aus, als ob die Normalen nach innen zeigen, was ja nich sein kann oder? Denke die CreateBox funktion (Direct3D9) wird die normalen schon nach ausen gezeigt anlegen??