我开始学习 C# 中的 DirectX 9。我想渲染两个三角形并围绕 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)
}
起始位置
旋转后
在第二张图片中,您可以看到我的问题。红色三角形在白色三角形的前面。如何在白色三角形后面绘制红色三角形?