• Zitat

    Spiele und Filme werden dann in Zukunft nicht mehr auf DVD's verkauft sondern auf Disketten. :D
    "Es ist sinnlos sich verrückt zu machen, indem ma

    Back to the roots!!! :D

    MfG hellboy

    [autoit]

    Do
    _help($user)
    Until $questions = 0

    [/autoit]

    Meine Werke:
    Ste`s Web-Radio

  • Oder er erfindet einen fetten kompressionsalgorytmus^^


    Und genau das ist ja die leistung der Programmierer. Ich meinte das es nichts besonderes ist, statt einer Videodatei eine exe zu verwenden, ansonsten staune ich schon sehr darüber.

  • campweb das hört sich aber ein "bisschen" anders an ...
    Und die .exe statt .film ist eben die Leistung, weil das quasi die kompression ist ...

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Hab mal gelsen das die Grafik Datein von kkrieger "ungepackt" 100 irgendwas mb groß währen. Das verfahren nennt sich glaube ich Prozedurales Programmiern. Ich hab das (jetzt mal ganz vereinfacht) so verstanden:

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

    Prozedur(2) ; Gibt eine Bilddatei von einem Haus wieder

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

    Prozedur(242) ; Und hier bekommen wir dann die Mona Lisa :D

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

    Func Prozedur($Seed)
    ;Inser some Crazy Code here :D
    endFunc

    [/autoit]

    Zum ersten mal bin ich bei einem Youtube Video über ein Weltraum MMO gestoßen das seine Welt mit mehrern Milliarden Planet ebenso erzeugt.

    Link zum Development FAQ des Spiels

  • Das verfahren nennt sich glaube ich Prozedurales Programmiern.


    Prozedurale Programmierung bezeichnet einfach nur das Prinzip Teilprobleme in Funktionen (auch "Prozeduren" genannt) auszulagern und eigenständig benutzbar zu machen.
    Also nichts weiter was wir in AutoIt nicht auch schon die ganze Zeit machen.
    Programmiert werden diese Dinger in der Regel komplett in Assembler.
    Somit können die schonmal den ganzen Overhead den ein Compiler erzeugt hinter sich lassen.
    Und dann - ja dann - kommt eine riesen Menge Gehirnschmalz um Algorithmen zu finden die die schnell sind und platzsparend.

  • Ich versteh immer noch nicht, wie man so etwas in Echtzeit rund HD realisieren kann! ?( ?( ?(
    Hier ist die Auslastung bei FullHD (1080p) bei 2x2,8 GHz und 3,3 GB ram :rock:
    Also wird nicht einmal 100% ereicht und beim RAM macht sich auch nicht viel!
    So etwas geniales hatte ich frühstens 2025 erwartet! 8o

    http://www.pic-upload.de/view-8782443/c…eicher.png.html

    ;) ;) ;) ;) ;) ;) ;) ;) so etwas beweist eindeutig zu viel Freizeit! ;) ;) ;) ;) ;) ;) ;) ;) ;)

  • Ne ich glaub der raft die leistung einfach nicht.
    Und meint das sowas ganz mega einfach zu realisieren ist mit dem was es schon gibt.

  • @Matthias_199, danke dass dus aussprvht, stimme dir zu.
    tutti, woran das liegtsgt Andy auf Seite 1 und postet ein Original ;)

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • "SUPER 2009 kann ich da empfehlen. Das is mal richtig genial <img style="font-style: italic;" src="http://www.computerhilfen.de/hilfen/Smileys/default/cheesy.gif" alt="wysiwyg image" />

    Beispiel: Mit Fraps GTA4 aufgenommen und mit VirtualDup die 4 Avi´s zusammen verbunden - Ergebniss war dann ne knapp 18GB grosse Avi...
    Mit Super2009, in meinem Fall ergab das dann knapp 50Mb (je nach Qualitätswunsch)

    Dieses kann von sämtlichen, in sämtliche Auflösungen und/oder Formaten bewerktstelligt werden.
    Sehr zuempfehlen... "

    Für das Video in Verbindung mit einem "Video zu Exe" Konverter und einer MiniGUI die die Auswahl der AUflösung enthält ergeben schon ein ganz gutes Ergebnis.


    Nicht dein ernst oder?

    [align=center]Meine Werke mit der Irrlicht Engine
    AutoIt Picture Viewer Dreidimensionaler Bildbetrachter
    Mr Bubble 3D Neue Interpretation des Flashklassikers Bubble trouble

  • @campweb, man merkt wieder deutlich, dass Leute mitreden, die auch nicht ansatzweise Ahnung haben um was es geht :thumbdown:
    IM 12. Post hier im Thread habe ich die Seite von Iñigo Quílez verlinkt, der in der Demo-Szene u.a. mit seinem Team rgba eingeschlagen ist. Bei Pixar war er bis vor kurzem noch technischer Direktor Animationen.

    Um z. B. diesen Schmetterling
    autoit.de/wcf/attachment/12507/
    zu "erzeugen", könnte man haufenweise Pixel "malen", komprimieren und würde dadurch haufenweise Speicherplatz verschwenden und es wärre schnarchlangsam!

    Überführt man aber diesen Schmetterling in eine mathematische Funktion,
    autoit.de/wcf/attachment/12508/
    dann kann man damit Shader programmieren und somit den Schmetterling in jeder beliebigen Auflösung und natürlich auch animiert darstellen.
    Die Handvoll Formeln stellen wirklich den Schmetterling dar!

    Ich hab mal in ein AutoItscript gepackt, wie man z.B Kleeblätter "konstruieren" kann...

    Spoiler anzeigen
    [autoit]

    ;kleeblatt
    $user32 = DllOpen("user32.dll")
    $gdi32 = DllOpen("gdi32.dll")
    $w = 400
    $h = 400

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

    Global $pi = 4*atan(1)

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

    $hgui = GUICreate("Kleeblatt")
    $hdc_gui = getdc($hgui)
    GUISetState()

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

    for $x=1 to $w
    for $y=1 to $h
    $r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
    $p=atan2(($w/2)-$x,($h/2)-$y)
    $l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
    $col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256
    pix($hdc_gui,$x,$y,$col)
    Next
    Next

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

    while GUIGetMsg()<>-3
    wend

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

    func atan2($y,$x)
    return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
    endfunc

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

    Func pix($dc, $x, $y, $color) ;pixel mit farbe an koordinaten setzen
    DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
    EndFunc ;==>pix

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

    Func GetDC($handle)
    $dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
    EndFunc ;==>GetDC

    [/autoit]
  • Habs mir angeschaut und ich finde es beeindruckend wie das überhaupt möglich ist.
    3Min Film + Ton = 64KB ? Das sind etwas weniger als 3kBit/s für FullHD und Ton.
    Ich bezweifele stark dass man das mittels kommpression erreichen kann. Nichtmal in hunderten Jahren^^
    (Außer es schafft jemand einen konverter von Film -> Asm und Ton -> Asm zu bauen)

    Daran sollten sich mal die großen Firmen ein Beispiel nehmen. Weil mich regt es schon auf, wenn die "modernen" Spiele 10-15 GB fressen oder sogar noch mehr. Wenn man es mal überlegt müsste das auch in 3-4MB passen.

    Man könnte ja zugunsten der CPU eine lange Ladezeit einbauen und alle Grafiken schonmal vorab generieren.

    Mit einer enormen Ladezeit müsste das auch in AutoIt möglich sein. (Wenn man die Frames berechnet und 'stapelt'. Dann braucht man vllt ein paar Tage bis alles berechnet ist (und wahrscheinlich gibt es eine RAM Überladung^^), hat dann aber einen flüssigen Film :P

  • Eine nette Demonstration, Andy.
    Danke für dieses Beispiel, tatsächlich eine sehr intelligente Form "große" Datenmengen in kleine umzuwandeln.
    Wenn man jetzt noch eine Funktion schreiben würde, die unsere Bilder in Zukunft in eine Func _Bild() umwandeln würde, dann hätten wir kein Problem mehr mit der größe unserer Programme ^^.
    Zudem könnte man sich auch das lästige "FileInstall" oder .zip mit den ganzen Dateien sparen.

    Aber alles noch Zukunft

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Zitat

    Wenn man jetzt noch eine Funktion schreiben würde, die unsere Bilder in Zukunft in eine Func _Bild() umwandeln würde, dann hätten wir kein Problem mehr mit der größe unserer Programme

    Dem Manne kann geholfen werden!
    http://de.wikipedia.org/wiki/Diskrete_Kosinustransformation
    http://de.wikipedia.org/wiki/Schnelle_Fourier-Transformation
    spart nicht viel, aber doch einiges.

    Zitat

    Daran sollten sich mal die großen Firmen ein Beispiel nehmen. Weil mich regt es schon auf, wenn die "modernen" Spiele 10-15 GB fressen oder sogar noch mehr. Wenn man es mal überlegt müsste das auch in 3-4MB passen.

    Solange der Krempel gekauft wird, haben die Hersteller überhaupt keine Veranlassung, irgendetwas zu ändern. Da steht dann auf der Spiele-Packung "erfordert mindestens 8GB RAM" und die Kiddies kaufen....sowohl Spiel als auch RAM! Im Zweifelsfall wird zum Spiel für 50€ auch gleich der passende Rechner für 1500€ gekauft....

  • zu werkkzeug3

    Hab mir mal werkkzeug3 geholt (nur zum Testen der möglichkeiten)

    Es ist schon interessant wie das alles aufgebaut ist.
    Man hat eine Hand voll Grundeffekte (z.B. ein einfarbiger Kreis/Viereck), Einige Filter (Unschärfe, Rotieren, Kopieren, usw.) und Methoden zum verbinden von mehreren Ebenen. (mit addieren, subtrahieren, multi usw.)

    Damit kann man im prinzip jede beliebige Textur in ein paar Zeilen herstellen und auch komplexe Sachen sind kein großes Problem (wenn sich das jemand holt das Letzte Beispiel mal anschauen)

    Das ganze 3D Zeugs habe ich noch nicht vollständig verstanden.

    Wenn man in der realen Welt schon niemand ist, dann muss man wenigstens virtuell irgendwelche Rekorde halten.
    Deshalb suchten ungliaublich viele kleine Kinder vor dem PC. (und Facebook ist auch schuld. Die sind eh noch für den Weltuntergang verantwortlich...)
    Außerdem klingt es doch nach viel mehr wenn man eine Blue Ray Disk, oder VIER DVD´s für ein Spiel erhält als eine läppische 8cm - CD (das Geilste Speichermedium der Welt xD. Und darauf wäre genug Platz für gigantische spiele).

  • Hi Andy,

    ich hab mal ein bisschen mit deinem Code rumgespielt :P
    Sehr "interessant" wie sich da etwas anordnet :D

    Bearbeiteter Code von Andy
    [autoit]


    $user32 = DllOpen("user32.dll")
    $gdi32 = DllOpen("gdi32.dll")
    $w = 400
    $h = 400

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

    Global $pi = 4 * ATan(1)

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

    $hgui = GUICreate("-")
    $hdc_gui = GetDC($hgui)
    GUISetState()

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

    For $x = 1 To $w
    For $y = 1 To $h
    $r = Sqrt((($y - $w / 2 + $x) - $x) ^ 2 + (($h / 2) - $y) ^ 2) / 786
    $p = atan2(($w / 2) - $x, ($h / 2) - $y)
    $l = $r / (((1 + Cos(Random(1, 8, 1) * $p)) ^ (500)) - (1 / 40 * (1 + Cos(8 * $p)) ^ 2))
    $col = Int(1 / 4 * (1 - $l) ^ (500) * (1 + $l ^ 16) * (1 + 3 * $r) * 786) * 786
    pix($hdc_gui, $x, $y, $col)
    Next
    Next

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

    While GUIGetMsg() <> -3
    WEnd

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

    Func atan2($y, $x)
    return (2 * ATan($y / ($x + Sqrt($x * $x + $y * $y))))
    EndFunc ;==>atan2

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

    Func pix($dc, $x, $y, $color) ;pixel mit farbe an koordinaten setzen
    DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
    EndFunc ;==>pix

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

    Func GetDC($handle)
    $dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
    EndFunc ;==>GetDC

    [/autoit]

    Edit: Wie findet man eigentlich solche Formeln? Bin grade auf der Suche danach, Interessiert mich nähmlich sehr :)

    lg,
    Blume

  • Ich habe leider keine ahnung wie man "gezielt" nach solchen Sachen suchen kann...

    Aber ich habe ein kleines Skript gebastelt womit man seine Ideen ausprobieren kann...

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <WinAPIEX.au3>
    #include <GDIPlus.au3>

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

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

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

    Global Const $Size = 401
    Global Const $Breite = $Size
    Global Const $Hoehe = $Size
    Global Const $Titel = 'Mustergenerator...'
    Global Const $WS_EX_LAYERED = 0x00080000
    Global Const $WS_POPUP = 0x80000000
    Global Const $SRCCOPY = 0x00CC0020
    Global Const $BLACKNESS = 0x00000042
    Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
    Global Const $Stretch = 1

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

    Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0x000000, $hGUI)
    WinSetTrans($hGUI, '', 255)
    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    Global $hDC_GUI = _WinAPI_GetDC($hGUI)
    Global $ptr_Backbuffer, $hbmp_Backbuffer
    Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
    Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)

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

    Global $Frame, $Struct, $ptr, $hbmp
    Global $Counter = 0
    Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
    Global $Neu = True

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

    OnAutoItExitRegister('_Exit')

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

    _NeuesBild()

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

    While Sleep(20)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    If _IsPressed('20') Then _NeuesBild()
    If _IsPressed('53') Then _Save()
    WEnd

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

    ;##########################HIER EIGENE FORMELN EINBAUEN############################################
    ; r = Rotanteil
    ; g = Grünanteil
    ; b = Blauanteil
    ; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
    Func _Funktion($x, $y, ByRef $r1, ByRef $g1, ByRef $b1)

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

    Local $r, $g, $b, $w = $Breite, $h = $Hoehe, $p, $l, $col
    Local Static $Counter = 0
    $Counter += 1

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

    $r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
    $p=atan2(($w/2)-$x,($h/2)-$y)
    $l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
    $col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256

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

    Return $col

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

    $r1 = Hex($r, 2)
    $g1 = Hex($g, 2)
    $b1 = Hex($b, 2)

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

    Return 0
    EndFunc
    ;###################################################################################################

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

    func atan2($y,$x)
    return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
    endfunc

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

    Func _NeuesBild()

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

    _GDIPlus_Startup()
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    Local $g = '88', $r = '34', $b = '99'
    Local $Prozent = 0
    Local $pxGes = $Hoehe * $Breite, $col

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

    $Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
    $Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)

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

    For $i = 0 To $Hoehe Step 1
    For $j = 0 To $Breite Step 1
    $col = _Funktion($i, $j, $r, $g, $b)

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

    If $col Then
    DllStructSetData($Struct, 1, $col, $j * $Breite + $i + 1)
    Else
    DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i + 1)
    EndIf
    Next
    $Prozent = ($i * $Hoehe + $j) / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next

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

    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_Shutdown()
    $Neu = True
    Sleep(100)

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

    EndFunc ;==>_BilderLaden

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

    Func _Save()
    Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
    _GDIPlus_Startup()
    Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
    _GDIPlus_ImageSaveToFile($bm, $Pfad)
    _GDIPlus_BitmapDispose($bm)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Exit()
    ConsoleWrite('Blubb')
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
    _Delete_Bitmap32($Frame, $hbmp)
    DllClose($h_NTDLL_DLL)
    Exit
    EndFunc ;==>_Exit

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

    Func _Delete_Bitmap32($hDC, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    EndFunc ;==>_Delete_Bitmap32

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

    Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    ;_arraydisplay($adib)
    _WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _C($a, $b)
    Switch $b
    Case 0 ;Y
    Return @DesktopHeight / 2 - $a / 2
    Case 1 ;X
    Return @DesktopWidth / 2 - $a / 2
    EndSwitch
    EndFunc ;==>_C

    [/autoit]


    Bei der "_Funktion" kann man seine Formel einsetzen und schauen wie das Ergebnis aussieht...


    um der Prozeduralen Texturierung etwas näher zu kommen habe ich mal versucht die PerlinNoise Funktion nachzubauen.
    War im Prinzip relativ einfach und die geht auch relativ Flott.

    Spoiler anzeigen
    [autoit]

    #include <Misc.au3>
    #include <WinAPIEX.au3>
    #include <GDIPlus.au3>

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

    Opt("MustDeclareVars", 1)
    Opt("GUIOnEventMode", 1)

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

    Global Const $Size = 300
    Global Const $Breite = $Size
    Global Const $Hoehe = $Size
    Global Const $Titel = 'Mustergenerator...'
    Global Const $WS_EX_LAYERED = 0x00080000
    Global Const $WS_POPUP = 0x80000000
    Global Const $SRCCOPY = 0x00CC0020
    Global Const $BLACKNESS = 0x00000042
    Global Const $h_NTDLL_DLL = DllOpen('ntdll.dll')
    Global Const $h_MSIMG32_DLL = DllOpen('msimg32.dll')
    Global Const $gdi32 = DllOpen('gdi32.dll')
    Global Const $Stretch = 1

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

    Global $hGUI = GUICreate($Titel, $Breite * $Stretch, $Hoehe * $Stretch, _C($Breite * $Stretch, 1), _C($Hoehe * $Stretch, 0), $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0x000000, $hGUI)
    WinSetTrans($hGUI, '', 255)
    GUISetOnEvent(-3, '_Exit', $hGUI)
    GUISetState(@SW_SHOW, $hGUI)

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

    _GDIPlus_Startup()

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

    Global $hDC_GUI = _WinAPI_GetDC($hGUI)
    Global $ptr_Backbuffer, $hbmp_Backbuffer
    Global $hDC_Backbuffer = _CreateNewBmp32($Breite, $Hoehe, $ptr_Backbuffer, $hbmp_Backbuffer)
    Global $DLL_Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr_Backbuffer)
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHDC($hDC_GUI)

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

    Global $Frame, $Struct, $ptr, $hbmp
    Global $Counter = 0
    Global $Mode = 0 ;0 = Vorwärts, 1 = Rückwärts
    Global $Neu = True

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

    OnAutoItExitRegister('_Exit')

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

    ;~ _NeuesBild()
    Local $a = _PerlinNoise($Breite, $Hoehe, Random(1, 7, 1))
    $Frame = $a[0]
    $ptr = $a[2]
    $hbmp = $a[1]

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

    While Sleep(20)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    If _IsPressed('20') Then _Neu()
    If _IsPressed('53') Then _Save()
    WEnd

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

    Func _Neu()
    _Delete_Bitmap32($Frame, $hbmp)
    Local $a = _PerlinNoise($Breite, $Hoehe, Random(1, 7, 1))
    $Frame = $a[0]
    $ptr = $a[2]
    $hbmp = $a[1]

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

    EndFunc

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

    ;##########################HIER EIGENE FORMELN EINBAUEN############################################
    ; r = Rotanteil
    ; g = Grünanteil
    ; b = Blauanteil
    ; Es muss das Hex-Format verwendet werden. Hex(blabla, 2)
    Func _Funktion($x, $y, ByRef $r1, ByRef $g1, ByRef $b1)

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

    Local $r, $g, $b, $w = $Breite, $h = $Hoehe, $p, $l, $col
    Local Static $Counter = 0
    $Counter += 1

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

    Local Static $start = 0.08
    If $Neu Then
    $Neu = False
    $start += 0.01
    ToolTip($start)
    EndIf

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

    $x = $x/$Breite * 256
    $y = $y/$Hoehe * 256

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

    ;~ $r=sqrt((($w/2)-$x)^2+(($h/2)-$y)^2)/150
    ;~ $p=atan2(($w/2)-$x,($h/2)-$y)
    ;~ $l=$r/(((1+cos(4*$p))^0.125)-(1/40*(1+cos(8*$p))^2))
    ;~ $col=int(1/4*(1-$l)^0.125*(1+$l^16)*(1+3*$r)*256)*256

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

    ;~ Return $col

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

    $r=$x*Sin($y*$start)
    $g=$x*Cos($y*$start)
    $b=$x*Tan($y*$start)

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

    $r1 = Hex($r, 2)
    $g1 = Hex($g, 2)
    $b1 = Hex($b, 2)

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

    Return 0
    EndFunc
    ;###################################################################################################

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

    func atan2($y,$x)
    return (2*atan($y/($x+sqrt($x*$x+$y*$y))))
    endfunc

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

    Func _PerlinNoise($b, $h, $Tiefe = 5)
    If $Tiefe < 1 Then $Tiefe = 1
    If $Tiefe > 7 Then $Tiefe = 7

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

    ;Es werden 6 Bilder erstellt und überlagert
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $bmp = _GDIPlus_BitmapCreateFromGraphics($b, $h, $hGraphics)
    Local $pxGes = 0, $col, $Prozent, $px = 0

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

    For $p = 0 To $Tiefe Step 1 ;p = BildNummern
    For $x = 0 To $b/2^($Tiefe-$p) Step 1
    For $y = 0 To $h/2^($Tiefe-$p) Step 1
    $pxGes += 1
    Next
    Next
    Next

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

    Local $bmp2 = _GDIPlus_BitmapCloneArea($bmp, 0, 0, $b, $h)
    Local $bbuffer = _GDIPlus_ImageGetGraphicsContext($bmp2)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)

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

    For $p = 0 To $Tiefe Step 1 ;p = BildNummern
    For $x = 0 To $b/2^($Tiefe-$p) Step 1
    For $y = 0 To $h/2^($Tiefe-$p) Step 1
    $px += 1
    Switch Random(0, 1, 1)
    Case 0
    $col = '0x'&Hex(255/2^$p, 2)&'000000'
    Case 1
    $col = '0x'&Hex(255/2^$p, 2)&'FFFFFF'
    EndSwitch
    _pix($bmp, $x, $y, $col)
    Next
    $Prozent = $px / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next
    _GDIPlus_GraphicsDrawImageRectRect($bbuffer, $bmp, 0, 0, $b/2^($Tiefe-$p), $h/2^($Tiefe-$p), 0, 0, $b, $h)
    Next

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

    Global $_ptr, $_hbmp
    Global $_hdc = _CreateNewBmp32($b, $h, $_ptr, $_hbmp)
    Local $gra = _GDIPlus_GraphicsCreateFromHDC($_hdc)
    _GDIPlus_GraphicsDrawImage($gra, $bmp2, 0, 0)
    _GDIPlus_GraphicsDispose($gra)
    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_GraphicsDispose($bbuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_BitmapDispose($bmp)
    _GDIPlus_BitmapDispose($bmp2)
    Local $a[3] = [$_hdc, $_hbmp, $_ptr]
    Return $a
    EndFunc

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

    Func _pix($hBitmap, $ix, $iy, $color)
    DllCall($ghGDIPDll, "int", "GdipBitmapSetPixel", "hwnd", $hBitmap, "int", $iX, "int", $iY, "dword", $color)
    EndFunc ;==>pix

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

    Func _NeuesBild()

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

    ;~ _GDIPlus_Startup()
    _Winapi_StretchBlt($hDC_Backbuffer, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $Frame, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Local $hBuffer = _GDIPlus_GraphicsCreateFromHDC($hDC_Backbuffer)
    Local $hPen = _GDIPlus_PenCreate(0xFFFFFFFF)
    Local $hBrush = _GDIPlus_BrushCreateSolid(0xFFFFFFFF)
    Local $g = '88', $r = '34', $b = '99'
    Local $Prozent = 0
    Local $pxGes = $Hoehe * $Breite, $col

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

    $Frame = _CreateNewBmp32($Breite, $Hoehe, $ptr, $hbmp)
    $Struct = DllStructCreate('int[' & $Breite * $Hoehe & ']', $ptr)

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

    For $i = 0 To $Hoehe Step 1
    For $j = 0 To $Breite Step 1
    $col = _Funktion($i, $j, $r, $g, $b)

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

    If $col Then
    DllStructSetData($Struct, 1, $col, $j * $Breite + $i + 1)
    Else
    DllStructSetData($Struct, 1, '0xFF' & $r & $g & $b, $j * $Breite + $i + 1)
    EndIf
    Next
    $Prozent = ($i * $Hoehe + $j) / $pxGes
    _GDIPlus_GraphicsDrawRect($hBuffer, 5, $Hoehe - 20, $Breite - 10, 15, $hPen)
    _GDIPlus_GraphicsFillRect($hBuffer, 7, $Hoehe - 18, ($Breite - 13) * $Prozent, 12, $hBrush)
    _Winapi_StretchBlt($hDC_GUI, 0, 0, $Breite * $Stretch, $Hoehe * $Stretch, $hDC_Backbuffer, 0, 0, $Breite, $Hoehe, $SRCCOPY)
    Next

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

    _GDIPlus_GraphicsDispose($hBuffer)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_BrushDispose($hBrush)
    ;~ _GDIPlus_Shutdown()
    $Neu = True
    Sleep(100)

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

    EndFunc ;==>_BilderLaden

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

    Func _Save()
    Local $Pfad = FileSaveDialog('BildSpeichern', @ScriptDir & '\Muster', '(*,.png)', Default, Hex(Random(256, 16^3, 1), 3) & '.png')
    _GDIPlus_Startup()
    Local $bm = _GDIPlus_BitmapCreateFromHBITMAP($hbmp)
    _GDIPlus_ImageSaveToFile($bm, $Pfad)
    _GDIPlus_BitmapDispose($bm)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func _Exit()
    ConsoleWrite('Blubb')
    _WinAPI_ReleaseDC($hGUI, $hDC_GUI)
    _GDIPlus_Shutdown()
    _Delete_Bitmap32($hDC_Backbuffer, $hbmp_Backbuffer)
    _Delete_Bitmap32($Frame, $hbmp)
    DllClose($h_NTDLL_DLL)
    DllClose($h_MSIMG32_DLL)
    DllClose($gdi32)
    Exit
    EndFunc ;==>_Exit

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

    Func _Delete_Bitmap32($hDC, $hBmp)
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_ReleaseDC(0, $hDC)
    EndFunc ;==>_Delete_Bitmap32

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

    Func _CreateNewBmp32($iWidth, $iHeight, ByRef $ptr, ByRef $hBmp) ;erstellt leere 32-bit-Bitmap; Rückgabe DC und ptr und handle auf die Bitmapdaten
    ;by Andy
    Local $hcdc = _WinAPI_CreateCompatibleDC(0) ;Desktop-Kompatiblen DeviceContext erstellen lassen
    Local $tBMI = DllStructCreate($tagBITMAPINFO) ;Struktur der Bitmapinfo erstellen und Daten eintragen
    DllStructSetData($tBMI, "Size", DllStructGetSize($tBMI) - 4);Structgröße abzüglich der Daten für die Palette
    DllStructSetData($tBMI, "Width", $iWidth)
    DllStructSetData($tBMI, "Height", -$iHeight) ;minus =standard = bottomup
    DllStructSetData($tBMI, "Planes", 1)
    DllStructSetData($tBMI, "BitCount", 32) ;32 Bit = 4 Bytes => AABBGGRR
    Local $adib = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBMI), 'uint', $DIB_RGB_COLORS, 'ptr*', 0, 'ptr', 0, 'uint', 0)
    $hBmp = $adib[0] ;hbitmap handle auf die Bitmap, auch per GDI+ zu verwenden
    $ptr = $adib[4] ;pointer auf den Anfang der Bitmapdaten, vom Assembler verwendet
    ;_arraydisplay($adib)
    _WinAPI_SelectObject($hcdc, $hBmp) ;objekt hbitmap in DC
    Return $hcdc ;DC der Bitmap zurückgeben
    EndFunc ;==>_CreateNewBmp32

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

    Func _C($a, $b)
    Switch $b
    Case 0 ;Y
    Return @DesktopHeight / 2 - $a / 2
    Case 1 ;X
    Return @DesktopWidth / 2 - $a / 2
    EndSwitch
    EndFunc ;==>_C

    [/autoit]