Probleme mit Z-Buffer



  • Hi,

    wir sitzen hier gerade an einem kleinen Managed Direct3D Projekt mit C#. Es handelt sich um einen einfachen 3D Funktioneplotter, der dreidimensionale Funktionen darstellt. Leider klappt da irgendetwas mit dem Z-Buffer nicht. Es scheint, als würden die Vertices einfach übereinander gezeichnet -- in der Reihenfolge, wie sie im Array stehen. Wir haben keine Ahnung, wieso und was wir machen könnten.

    Was vielleicht wichtig ist, zu erwähnen, dass die Z-Achse nach oben zeigen soll, und die Y-Achse nach hinten, da so ja auch die Funktionen dargestellt werden.

    Hier mal ein paar Code-Schnipsel:

    public void Init(){
    ...
        presentParams.Windowed   = true;
        presentParams.SwapEffect = SwapEffect.Discard;
        device = new Device(0, DeviceType.Hardware, this, CreateFlags.HardwareVertexProcessing, presentParams);
    
        device.RenderState.CullMode = Cull.None;
    
        device.RenderState.ZBufferEnable     = true;
        presentParams.EnableAutoDepthStencil = true;
        presentParams.AutoDepthStencilFormat = DepthFormat.D16;
    
        // WICHTIG: die Z-Achse soll nach oben zeigen, da es ja ein 
        // Funktionsplotter f(x,y) ist.    
        Vector3 eye    = new Vector3(  0.0f, -250.0f, 150.0f); 
        Vector3 lookAt = new Vector3(  0.0f,    0.0f,   0.0f);
        Vector3 up     = new Vector3(  0.0f,    0.0f,   1.0f);
    
        Matrix viewMat = Matrix.LookAtLH(eye, lookAt, up);
        // flip the x axis so that the positiv values are on the right
        viewMat.M11 *= -1;
    
        device.Transform.View = viewMat;
    
        // 2) projection matrix
        float fieldOfView = (float)Math.PI/4;
        float aspectRatio = 800.0f / 600.0f;
        float nearPlaneZ = -200.0f;
        float farPlaneZ  =  200.0f;
    
        device.Transform.Projection = Matrix.PerspectiveFovLH(fieldOfView, 1, nearPlaneZ, farPlaneZ);
    ...
    }
    
    public void Render()
    {
    ...
        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.Black, 1.0f, 0);
    ...
    }
    

    So. Der Plotter wird wie folgt initialisiert: es gibt ein Raster mit x- und y-Werten, das eigentlich als Fläche in den Raum hinein geht. Die Z-Werte werden durch eine math. Funktion ermittelt und bilden die Höhe an jeder Position.

    Ist es ein Problem für den Z-Test, dass unsere Achsen vertauscht sind? Bräuchten wir eigentlich einen "Y-Test"?? Eigetnlich werden die Matrizen (hier View) erst verrechnet und dann erst getestet, oder???



  • Nearplane muss größer 0 sein. Siehe DXSDK Doku.

    Bye, TGGC \-/



  • Ja, haben wir auch schon festgestellt. Aber leider hilft das nix 😞



  • Dieses Problem wurde IMHO nicht ausreichend genau geschildert, um eine hilfreiche Antwort zu geben.
    Fragen clever stellen

    Dieses Posting wurde nicht automatisch generiert sondern per Hand eingefügt. Beschwerden werden trotzdem ignoriert.

    Disclaimer: dies ist kein direkter persönlicher Angriff.

    Bye, TGGC (Reden wie die Großen)



  • Hää???

    Was ist DAS denn?? Naja, auch egal. Wir können das Problem nicht genauer schildern. Wenn wir es könnten, wüssten wir wahrscheinlich auch schon die Antwort 😉

    Vielleicht hat jemand ja noch nen Tipp....

    PS: zudem sind Foren ja eigentlich dafür da, dass Leute, die mehr wissen, anderen mit diesem Wissen helfen



  • public void Render() 
    { 
    ... 
        device.Clear(ClearFlags.Target | ClearFlags.ZBuffer, System.Drawing.Color.Black, 1.0f, 0); 
    ... 
    }
    

    Könnte an den Flags liegen. Schreib man die Konstanten aus dem DX-Header rein.



  • Hmm, allerdings machen das alle Samples so. Ist ja auch eigentlich logisch. RenderTarget und Z-Buffer sollen gelöscht werden. Aber was meinst Du denn mit "Konstanten aus dem DX-Header"?



  • Könnte ja sein das hier falsche Wert drin stehen.

    ClearFlags.Target | ClearFlags.ZBuffer


Anmelden zum Antworten