Wie würde das machen?



  • Hi,
    ich schmöker gerade im Buch 3D-Grafik Programmierung von Marius Apetri und bin noch ganz am Anfang. Mein System ist ein Windows 7 64Bit und leider hab ich die Beispiele aus dem Buch nicht zum kompilieren bekommen, da es wohl schon ein wenig älter ist und er in seinen Bespielen noch DDraw verwendet. Diese sind wohl in der neuen DXD Version raus geflogen. Da ich nicht weiß, ob es erlaubt ist Quellen von dem Buch zu posten, beschreibe ich kurz sein Beispiel und poste dann mein Umsetzung. In seinem Bespiel versucht er die Adressierung der Bildschirmkoordinaten zu erklären in dem er X und Y durch ein Randomzahl ermittelt und diese Koordinate weiß/schwarz oder einen grau wert zuordnet.
    Das sieht in seinem Beispiel dann aus wie ein Bildschirmrauschen vom Fernseher.
    Ich habe versuch dieses Beispiel auch zu programmieren in C# mit Mircosoft.directX
    Also ein DirectX -Fenster erstellt in der OnPaint mein Rendere- funktion eingebaut und bei jeden Aufruf ein Pixel per Zufall gewählt und gesetzt.
    Bei mir läuft das aber deutlich langsamer ab als in seinen Beispiel so das nicht wirklich ein Rauschen entstand sondern viel mehr ein langsames erscheinen meiner Punkte.
    Also entschied ich mich die gesamten Pixel 5mal zu initialisieren und abwechselnd anzuzeigen nun entsteht zwar annähernd das verhalten wie in seinen Beispiel ist aber trotzdem noch für mich unbefriedigend.
    hier mein Beispiel :

    ....
     private CustomVertex.TransformedColored[][] vertexesBlur;
      vertexesBlur = new CustomVertex.TransformedColored[10][];
    ...
    //Initialisierung
     Random random = new Random();
    
     for (int tIdx = 0; tIdx < vertexesBlur.Length;tIdx++ )
       {
        vertexesBlur[tIdx] = new CustomVertex.TransformedColored[640 * 480];
        for (int tX = 0; tX < 640; tX++)
         {
           int tOffset = tX;
           for (int tY = 0; tY < 480; tY++,tOffset+=640)
           {
            int tColor = random.Next(192,256);
            vertexesBlur[tIdx][tOffset].Position = new Vector4(tX, tY, 0, 1.0f);
            vertexesBlur[tIdx][tOffset].Color = 
            ((Color)mMyColorGradient.GetValue(tColor)).ToArgb();
           }        
         }
       }
    

    und in der OnPaint:

    m_Device.Clear(ClearFlags.Target,
                      System.Drawing.Color.FromArgb(0, 0, 0).ToArgb(), 0.0f, 0);
       m_Device.BeginScene();
       m_Device.VertexFormat = CustomVertex.TransformedColored.Format;
       Random random = new Random();
       int tIdx = random.Next(0,10);
       m_Device.DrawUserPrimitives(PrimitiveType.PointList, 
                                   vertexesBlur [tIdx].Length, vertexesBlur[tIdx]);
       m_Device.EndScene();
       m_Device.Present();
    

    meine Frage ist nun: wie könnte man das noch lösen bzw. anders lösen?
    Grüße


Anmelden zum Antworten