Правильно ли отображать перекрывающиеся треугольники?
Я начал изучать DirectX 9 на C#. Я хочу сделать два треугольника и повернуть их вокруг оси Y.
В этой части я инициализирую устройство:
public bool InitializeDevice()
{
try
{
meshList = new List<Sphere>();
// Erstellt die PresentParameters für weitere Einstellungen des Device
PresentParameters presParams = new PresentParameters() {
Windowed = true, // Device nur innerhalbe des Fensterhandels benutzen
SwapEffect = SwapEffect.Discard, // Grafikkarte entscheidet selbst wie sie den Backbuffer zur anzeige bringt
};
// Erzeugt eine Instanz von dem Device
device = new Device(0, // Nummer fuer den Grafikadapter der verwendet wird
DeviceType.Hardware, // Parameter über die Garfikkarte oder CPU ausführen
Panel_3D, // Fensterhadel für das Device
CreateFlags.SoftwareVertexProcessing, // Einstellung des Device. Gibt an, dass die Vertices nur per Software verarbeitet werden
presParams); // Gibt die weiteren Einstellungen mit
// Wenn das Device neupositioniert wird
device.DeviceReset += new System.EventHandler(this.OnResetDevice);
// Führt das Reset aus
OnResetDevice(device, null);
// Definiert keine Vor und Rückseite
device.RenderState.CullMode = Cull.Clockwise;
// Direct3D-Beleuchtung deaktivieren
device.RenderState.Lighting = false;
// Beschreibt einen festen Füllmodus
device.RenderState.FillMode = FillMode.Solid;
// Erstellt den Buffer für die Vertices (Lab Koordinatensystem)
vertexBuffer = new VertexBuffer(typeof(CustomVertex.PositionColored), // Typ der Vertices
18, // Anzahl der Vertices
device, // Gerätekontext unser device
0, // Anzahl der Flags zur Verarbeitung der Vertice
CustomVertex.PositionColored.Format, // Typ der Vertices (Weil man auch eigene Strukturen definieren kann)
Pool.Default); // Speicherung der Vertices
// Event welches aufgerufen wird wenn der Vertexbuffer erstellt wurde
vertexBuffer.Created += new System.EventHandler(this.OnCreateVertexBuffer);
// Event wird von Hand aufgerufen
this.OnCreateVertexBuffer(vertexBuffer, null);
return true; // Device wurde erstellt
}
catch { return false; } // Device konnte nicht erstellt werden
}
Для VertexBuffer я использую CustomVertex.PositionColored[]
,
В этой части я настраиваю матрицы и отрисовываю примитивы:
/// <summary>
/// Berechnen und Darstellen des Bildes
/// </summary>
public void Render()
{
// Fragt ob das Device erstellt wurde und noch gültig ist
if (device == null)
return;
// Inhalt des Backbuffers löschen und das ganze mit einer Farbe einfärben
device.Clear(ClearFlags.Target, // Die entsprechende Oberfläche
System.Drawing.Color.Black,// Die Farbe
1.0f, // Abstand vom Betrachter, an dem die Oberfläche gelöscht wird und einen Wert, ...
0); // ...der in jedem Stencil-Buffer-Eintrag gespeichert wird.
// Anfang der Szene
device.BeginScene();
// Matrizen aufsetzen
SetupMatrices();
// Bindet den Buffer an das Device
device.SetStreamSource(0, // Nummer des Streams
vertexBuffer,// Der Buffer
0); // StartOffset in dem Buffer
// Teilt dem Device das Format der Vertices mit
device.VertexFormat = CustomVertex.PositionColored.Format;
// Zeichnet die Dreiecke
device.DrawPrimitives(PrimitiveType.LineList, // Typ der Primitive
0, // Eintrag des ersten Vertex
3); // Anzahl der Primetive
// Zeichnet das Rechteck
device.DrawPrimitives(PrimitiveType.TriangleList, // Typ der Primitive
6, // Eintrag des ersten Vertex
4); // Anzahl der Primetive
// Ende der Szene
device.EndScene();
// Bringt die Zeichnung auf das Fensterhandle
device.Present();
}
/// <summary>
/// Setzt die Matrizen auf
/// </summary>
private void SetupMatrices()
{
Matrix MX = Matrix.RotationX(impValue.ObjektRotationY);
impValue.ObjektRotationY = 0;
Matrix MY = Matrix.RotationY(impValue.ObjektRotationX);
impValue.ObjektRotationX = 0;
Matrix Rotation = device.Transform.World;
Rotation *= MY;
Rotation *= MX;
// Rotiert das device entlag der X und Y Achse
device.Transform.World = Rotation;
// Setzt den Benutzerblickwinkel auf
device.Transform.View = Matrix.LookAtLH(new Vector3(impValue.KameraPosX, impValue.KameraPosY, impValue.KameraPosZ), // Kameraposition
new Vector3(impValue.SchauPosX, impValue.SchauPosY, impValue.SchauPosZ), // Punkt, auf den geschaut wird
new Vector3(impValue.OberstePosX, impValue.OberstePosY, impValue.OberstePosZ)); // Vektor der angibt, wo oben ist
// Setzt die Ansichtsmatrix auf (Linke-Hand-orientiertes System)
device.Transform.Projection = Matrix.PerspectiveFovLH(impValue.BlickWinkel, // Sichtbereich (Blickwinkel)
impValue.SeitenVerhaeltnis, // Seitenverhältnis
impValue.NaheEbene, // Abstand zum nächsten sichtbaren Punkt (nahe Ebene)
impValue.FerneEbene); // Abstand zum letzten sichtbaren Punkt (ferne Ebene)
}
Начальная позиция
http://s1.directupload.net/images/130206/q3gu27ol.png
После вращения
Те же треугольники, но вращаются; http://s7.directupload.net/images/130206/753b42to.png
На второй картинке вы можете увидеть мою проблему. Красный треугольник перед белым треугольником. Как я могу нарисовать красный треугольник за белым треугольником?
1 ответ
Существуют разные подходы к обработке перекрывающихся граней в 3D-приложениях:
Буфер глубины (или Z-буфер) является очень распространенным решением, поскольку он дает превосходные результаты для непрозрачной геометрии.
Буфер глубины - это текстура, которая хранит информацию о глубине визуализированных пикселей. Если расстояние от пикселя до камеры больше, чем значение для этого пикселя в буфере глубины, пиксель отбрасывается. Если он ближе к камере, цвет записывается в цель рендеринга, а глубина обновляется.