Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

19.03.2016, 20:54

Tschuldigung, falls ich das etwas schlecht verstehe :)
Ich habe jetzt die Rundungen rausgenommen und x64 und y64 sind jetzt doubles

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public void GenerateNoise(BmpProcessor bmp)
        {
            for (int x = 0; x < 128; x++)
            {
                for (int y = 0; y < 128; y++)
                {
                    int gray128 = DoubleToByte(Map128[x, y]);

                    double x64 = (double)(x / 8);
                    double y64 = (double)(y / 8);
                    int gray64 = DoubleToByte(Map64[(int)x64, (int)y64]);

                    double pixel00 = Map64[(int)Math.Floor((double)x64), (int)Math.Floor((double)y64)];
                    double pixel01 = Map64[(int)Math.Floor((double)x64), (int)Math.Ceiling((double)y64)];
                    double pixel10 = Map64[(int)Math.Ceiling((double)x64), (int)Math.Floor((double)y64)];
                    double pixel11 = Map64[(int)Math.Ceiling((double)x64), (int)Math.Ceiling((double)y64)];

                    double weightX = x64 - Math.Floor((double)x64);
                    double weightY = y64 - Math.Floor((double)y64);

                    double pixelMixed =
                        ((1.0 - weightX) * (1.0 - weightY)) * pixel00 +
                        ((1.0 - weightX) * weightY) * pixel01 +
                        (weightX * (1.0 - weightY)) * pixel10 +
                        (weightX * weightY) * pixel11;

                    int gray = DoubleToByte(pixelMixed);

                    bmp.SetPixel(x, y, Color.FromArgb((byte)gray,
                                                      (byte)gray,
                                                      (byte)gray));
                }
            }
        }


Das Bild sieht aber genauso aus wie vorher (also so wie da wo ich noch gerundet habe)

12

19.03.2016, 21:16

Das sieht leider gar nicht aus wie es sollte ... hast du auch die Amplituden bei höheren Frequenzen verringert ?
Und selbst mit linearer Interpolation sollte es kein solches Ergebnis geben. Es sieht praktisch aus als ob gar nichts
interpoliert worden wäre.

13

19.03.2016, 21:17

Ampltuden? Frequenzen? Davon habt ihr nie was gesagt?
Kann vielleicht jemand den Code verbessern, nur damit ich das besser verstehe wie das funktioniert und was ich falsch gemacht habe.

Das Ergebnis sollte so ungefähr aussehen:

(Link)

14

19.03.2016, 21:19

Auch wenn ich das erst vor ein paar Wochen schon mal gepostet habe Perlin Noise.
Ich finde dort wird das sehr gut erklärt. Auch das mit Amplitude und Frequenz.

15

19.03.2016, 21:25

Dein Artikel scheint ganz gut erklärt so sein, aber auch ein bisschen kompliziert :) Noise-Funktionen? Könnte mir vielleicht trotzdem jemand noch mal helfen?

16

19.03.2016, 21:34

Noise-fuction meint nix anderes als eine Funktion die dir Zufallswerte in einem bestimmten Bereich erzeugt.
Das sollte kein Thema sein, das hat wohl jede Programmiersprache.

Bei deinem Code fällt mir als erstes auf dass du 4 verschieden große Maps überlagerst, soweit ich das kenne
sind die normal gleich groß. Deswegen bin ich mir nicht sicher, dass du das alles richtig verstanden hast.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »QuickAndDirty« (19.03.2016, 21:40)


17

19.03.2016, 21:46

Zu dem Thema mit den unterschiedlich großen Maps:
Weil die Map64 ja halb so groß ist wie die Map128 habe ich ja auch diese Zeile benutzt:

Quellcode

1
int x64 = (int)Math.Round((double)(x / 2));


Diese Zeile soll dafür sorgen das jedem Pixel der Map128 ein Pixel der Map64 zugewiesen wird. Beispiel

Quellcode

1
2
3
4
5
6
7
Map128    Map64
1         1
2         1
3         2
4         2
5         3
6         3


Das heißt jeder Pixel der Map64 ist für vier Pixel der Map128 zuständig.
Beispiel: Der Pixel (0|0) von Map64 ist für die Pixel (0|0) (0|1) (1|0) (1|1) zuständig.

Ich glaube schon das ich diesen Part verstanden habe, aber den Rest nicht so.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

18

19.03.2016, 21:48

@QuickAndDirty
Im von dir verlinkten Artikel wird doch auch Rauschen mit unterschiedlicher Auflösung zusammengemischt.
Sogar mehr als 4 Maps.

@GameXCraft
Der Code sieht eigentlich richtig aus.

EDIT:
Ah nein, ich seh einen Fehler.
x / 8 ist immernoch eine Integerrechnung. Teil mal durch 8.0.

19

19.03.2016, 21:52

@SpieleProgrammierer: Stimmt, das habe ich übersehen und jetzt sieht das Bild auch schon mehr nach Perlin-Noise aus:

(Link)

Sieht aber immernoch ein bisschen pixelig aus, also nicht so weich, wie es sein sollte.

EDIT: Ich habe hier noch mal den aktuellen Code: (Diesmal als Link damit ich den Thread nich so vollspamme :)

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »GameXCraft« (19.03.2016, 21:59)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

20

19.03.2016, 21:55

Das selbe musst du mit den anderen Rausch-Maps auch noch machen.

Werbeanzeige