[OpenGl] (Etwas langsames) Mandelbrot

  • Mal ein kleines Experiment, der Name sagt ja alles ^^.

    Spoiler anzeigen
    [autoit]

    ; Ported from http://nerdworld.de/programmierung…l-in-farbe.html
    #include <gl.au3>
    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit]

    Global $iSize = 500, $iScale = (2/$iSize)
    Global $gui = GUICreate("OpenGL", $iSize, $iSize), $dc, $rc, $l = GUICtrlCreateLabel("Bitte (lange) warten", 0, 0)
    Global $aPixel[$iSize+1][$iSize+1], $maxpix = $iSize^2, $halfsize = $iSize/2
    GUISetOnEvent(-3, "quit")

    [/autoit] [autoit][/autoit] [autoit]

    If Not glInit($gui, $dc, $rc) Then
    MsgBox(48, "Error", "Error bei der Initialisierung von OpenGL-Funktionen" & @CRLF & "Error code: " & @error)
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    glMatrixMode($GL_PROJECTION)

    [/autoit] [autoit][/autoit] [autoit]

    $maxiteration = 15
    glClear($GL_COLOR_BUFFER_BIT)
    glBegin($GL_POINTS)
    for $py = 0 to $iSize step 1
    for $px = 0 to $iSize Step 1
    $x0 = (4/$iSize)*$px-2
    $y0 = (4/$iSize)*$py-2
    $x = $x0
    $y = $y0
    $iteration = 0
    While (($x^2 + $y^2) < 4 AND $iteration < $maxiteration)
    $xtemp = $x*$x - $y*$y + $x0
    $y = 2*$x*$y + $y0
    $x = $xtemp
    $iteration+= 1
    WEnd
    glColor3ub(0, 0, 255*($iteration/$maxiteration))
    glVertex2d($iScale*($px-$halfsize), -($iScale*($py-$halfsize)))
    Next
    Next
    glEnd()
    glSwapBuffers($dc)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func quit()
    glTerminate($gui, $dc, $rc)
    Exit
    EndFunc

    [/autoit]
  • :thumbup:

    Jetzt komm endlich in die Puschen und mach den klitzekleinen Schritt, OpenGl und OpenCl zusammenzubringen. 8o
    Deine UDF steht ja, OpenCl zu 95% auch, beides zusammen wäre dann jedenfalls für Grafiken das Optimum!

    Allein mit der Berechnung der einzelnen Pixel komme ich mit OpenCl auf sehr hohe Frameraten, wenn dann noch die im Verhältnis zur Berechnung sehr langsamen Speichertransferraten vom Grafikkartenram in den Hauptspeicher wegfallen, sollte der "Flug" durch die Mandelbrotmenge mit irren Frameraten funktionieren.

    Dann ist der "AutoIt"- Mandelbulb in 3D nicht mehr weit....

  • Hi,

    Zitat

    Nimm doch gleich GLSL. Das ist die Shadersprache von OpenGL.

    Wenn man auschliesslich (3D)Grafiken (be)rechnet, ist das sicherlich die einfachste Variante.
    Wenn es aber, wie z.B. bei Winzip, darauf ankommt "Nicht-Grafik"-Programme mittels GPU zu beschleunigen, dann ist OpenCl die universalere Methode.

    Ich vermute, in den nächsten 2-3 Entwicklungsstufen Software werden die Konzepte sowieso zusammenwachsen, und es wird eine (einfache) universelle Sprache geben, die vorhandene Hardwarekapazitäten optimal ausnutzt.

  • Jetzt komm endlich in die Puschen und mach den klitzekleinen Schritt, OpenGl und OpenCl zusammenzubringen.

    Uno momento. Ich kann nicht aufm Wasser laufen, dafür brauch ich auch erstmal Zeit mich einzuarbeiten, und Zeit ist momentan ein Problem ^^.

    Dann ist der "AutoIt"- Mandelbulb in 3D nicht mehr weit

    Das ist das Endziel ;)

  • Bei mir ist das Mandelbrot eine blau leuchtende Schneeflocke o.O`?

    Schonmal ein Mandelbrot gesehen? Das Leuchten wird wohl den Bildschirm sein, das Blau ist ne Farbe. Dargestellt wird es in Blaustufen. :D

    Wäre noch praktisch, wenn du die includete UDF auch gleich angehängt hättest...selber suchen mag ich nicht

    Du hast doch auch mein Feuerwerkskript getestet :P

    minx Nettes Skript, bin mal gespannt, was als nächstes kommt.

    Danke :D. Mal schauen was so als nächstes kommt. Wenn du mal in Mars Thread guckst, da habe ich ein Skript gepostet, in dem geht speedmäßig die Post ab ^^. Es werden sich bestimmt noch irgendwann tolle Skripte ergeben :thumbup:

  • Aha :D

    Hier nochmal das Skript. Ich finde es einfach genial: [url=http://autoit.de/index.php?page=Attachment&attachmentID=17137&h=9da78b8be59ef22644e89b07c7e3b199d12207d8]Klick

    Einmal editiert, zuletzt von minx (10. Dezember 2012 um 16:52)

  • Wieso denn das?

    //Ist doch ne GUI mit Animation. Hier gerne nochmal im Fullscreen. Aber das läuft nicht mehr ganz so flüssig ^^

    Ersetz einfach den Header durch:

    [autoit]

    Local $iWidth = @DesktopWidth, $iHeight = @DesktopHeight, _ ; Bei 16:9 Verhältnis
    $hGUI = GUICreate("480p Rauschen", $iWidth, $iHeight, 0, 0, 0x80000000, 0x00000008), _
    $hPic = GUICtrlCreatePic("", 0, 0, $iWidth, $iHeight), _ ; Durch Pic bleibt das Bild immer erhalten
    $tBits = DllStructCreate("int[" & $iWidth*$iHeight & "]"), _ ; Struct mit der maximalen Auflösung
    $pBits = DllStructGetPtr($tBits), _ ; Pointer der Struct
    $hBitmap, $aCall, $iHMsg, _ ; Container für Zeichnung
    $hPicHandle = GUICtrlGetHandle($hPic), _ ; Handle für das Message-Empfangen
    $tRandom = DllStructCreate("dword"), _ ; Struct / Pointer für zufällige Farbe
    $pRandom = DllStructGetPtr($tRandom)

    [/autoit]

    Einmal editiert, zuletzt von minx (10. Dezember 2012 um 16:50)

  • Hi,

    Zitat

    Gibts das auch in Fullscreen?

    Ja, als 16 Byte große, ausführbare *.COM Datei. Entweder auf XP direkt starten oder ab Win7 in einer DOS-Box.
    autoit.de/wcf/attachment/17162/