Freigeben über


Tiefenverzerrung (Direct3D 9)

Polygone, die in Ihrem 3D-Raum koplanar sind, können so aussehen, als ob sie nicht koplanar sind, indem sie jeweils eine Z-Verzerrung hinzufügen. Dies ist eine Technik, die häufig verwendet wird, um sicherzustellen, dass Schatten in einer Szene ordnungsgemäß angezeigt werden. Für instance hat ein Schatten auf einer Wand wahrscheinlich den gleichen Tiefenwert wie die Wand. Wenn Sie zuerst die Wand und dann den Schatten rendern, ist der Schatten möglicherweise nicht sichtbar, oder Tiefenartefakte sind sichtbar. Sie können die Reihenfolge umkehren, in der Sie die koplanaren Objekte rendern, in der Hoffnung, den Effekt rückgängig zu machen, aber Tiefenartefakte sind weiterhin wahrscheinlich.

Eine Anwendung kann dazu beitragen, sicherzustellen, dass coplanare Polygone ordnungsgemäß gerendert werden, indem sie den Z-Werten, die das System beim Rendern der Sätze von coplanaren Polygonen verwendet, eine Verzerrung hinzufügt. Um einer Gruppe von Polygonen eine Z-Verzerrung hinzuzufügen, rufen Sie die IDirect3DDevice9::SetRenderState-Methode kurz vor dem Rendern auf, und legen Sie den Parameter State auf D3DRS_DEPTHBIAS und den Value-Parameter auf einen geeigneten Gleitkommawert fest (ein geeigneter Wert kann z. B. von -1,0 bis 1,0 sein); Um diesen Wert an SetRenderState zu übergeben, müssen Sie auch den Wert in ein DWORD umwandeln. Ein höherer Z-Bias-Wert erhöht die Wahrscheinlichkeit, dass die von Ihnen gerenderten Polygone sichtbar sind, wenn sie mit anderen coplanaren Polygonen angezeigt werden.

Offset = m * D3DRS_SLOPESCALEDEPTHBIAS + D3DRS_DEPTHBIAS

Dabei ist m die maximale Tiefenneigung des gerenderten Dreiecks.

m = max(abs(delta z / delta x), abs(delta z / delta y)) 

Die Einheiten für den D3DRS_DEPTHBIAS- und D3DRS_SLOPESCALEDEPTHBIAS Renderstatus hängen davon ab, ob Z-Pufferung oder w-Pufferung aktiviert ist. Die Anwendung muss geeignete Werte bereitstellen.

Die Verzerrung wird nicht auf Linien- und Punktgrundtypen angewendet. Diese Verzerrung muss jedoch auf Dreiecke angewendet werden, die im Drahtmodellmodus gezeichnet werden.

// RenderStates
D3DRS_SLOPESCALEDEPTHBIAS, // Defaults to zero
D3DRS_DEPTHBIAS,           // Defaults to zero
// Caps
D3DPRASTERCAPS_DEPTHBIAS           
D3DPRASTERCAPS_SLOPESCALEDEPTHBIAS 

Pixelpipeline