Diese Frage geht an Leute, die bereits ein wenig mit C++ und Direct X programmiert haben:
Ich hab eine kleine 3D Engine geproggt, allerdings ein Problem dabei. Viele Polygone liegen exakt an der gleichen Stelle, was bei Rotation dieser zu Darstellungsfehlern führt. Das ganze nennt sich "Z-Fighting" weil 2 Polygone an der gleichen Stelle sind und der Z-Buffer nicth weiß, welches er eintragen soll.
Die Frage ist wie ich das Problem lösen kann. Hab jetz Ewigkeiten im Netz gesucht und bin immer wieder auf Depth-Bios gestoßen. Das ganze klingt zwar ganz nett, aber ich versteh net ganz die Berechnung des Bias und des Slope Wertes, damit das ganze Problemlos funktioniert.
Also die relevanten Daten meiner Engine:
Near Clip: 1.0f
Far Clip: 1000.0f
DepthStencilFormat: D3DFMT_D16
Die darstellbaren Objekte liegen irgendwo zwischen 20 und 100 vom Ursprung entfernt.
Ich wollte nun jedem Objekt (Quader) einen eigenen Bias Wert geben, so das wenn 2 Polygone übereinander sind das neuere gezeichnet wird. Leider funktionierte das mit diversem rumprobieren nicht. Ich brauch also eine genaue Berechnungsgrundlage, wie der Slope sein muss und um wieviel ich den Bias pro Durchlauf erhöhen muss, so das keine Artefakte mehr beim rendern entstehen.
Der eigentliche Renderdurchlauf:
for (int i=0; i < g_iMaxCubes; i++)
{
g_App.GetDevice()->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, g_fSlopeBias);
g_App.GetDevice()->SetRenderState(D3DRS_DEPTHBIAS, g_fBias*i);
g_App.GetDevice()->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,i*8,0,8,0,12);
}
g_App.GetDevice()->SetRenderState(D3DRS_SLOPESCALEDEPTHBIAS, 0.0f);
g_App.GetDevice()->SetRenderState(D3DRS_DEPTHBIAS, 0.0f);