Domanda

I started learning DirectX 9 in C#. I want to render two triangles and rotate them around the Y axis.

In this part I initialize the Device:

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 
} 

For the VertexBuffer I use the CustomVertex.PositionColored[].

In this part I setup the matrices and render the primitives:

/// <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)
}

Start position

Two triangles, red in front of white

After rotation

Same triangles, but rotated; red still in front of white

In the second picture you can see my problem. The red triangle is in front of the white triangle. How can I draw the red triangle behind the white triangle?

È stato utile?

Soluzione

There are different approaches for handling overlapping faces in 3D applications:

A depth buffer (or Z-buffer) is a very common solution, since it gives perfect results for opaque geometry.

The depth buffer is a texture that stores depth information of rendered pixels. If the distance of the pixel to the camera is greater than the value for that pixel in the depth buffer, the pixel is discarded. If it is closer to the camera, the color is written to the render target and the depth is updated.


Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top