Vorgehensweise zum Erzeugen einer Textur

9

Ich versuche ein Skript zu finden, das eine Textur erzeugt (die dann mit einem Graustufenbild multipliziert werden kann, um es "anzuwenden"). Bisher besteht meine Methode darin, den RNG zu säen und dann zufällig eine 8x8-Matrix von ganzen Zahlen im Bereich [0,3] zu erzeugen und dann diese Matrix zu einem 256x256-Bild zu skalieren, wobei ein gewisses Maß an Interpolation verwendet wird.

Hier ist eine Beispielausgabe (Startwert 24):

Beispiel http://adamhaskell.net/misc/texture/sample.png

Auf der linken Seite ist die Matrix mit Nearest-Neighbor-Interpolation skaliert. Rechts ist mein Versuch der bilinearen Interpolation. In den meisten Fällen scheint es in Ordnung zu sein, aber dann erhalten Sie Strukturen wie in der Mitte links, wo zwei diagonal aneinander grenzende orangefarbene Quadrate mit zwei diagonal aneinander grenzenden roten Quadraten stehen, und das Ergebnis ist keine Interpolation für diesen Bereich. Darüber hinaus wird es mehr wie eine Heatmap behandelt (wie die Fülle von Orange in der oberen linken Ecke zeigt), und das verursacht weitere Probleme.

Hier ist der Code, den ich für meine "bilineare Interpolation" habe:

%Vor%

In der Realität ist das vielleicht ein XY-Problem. Was ich gerade versuche, ist, in einem Spiel, das ich plane, "Fellmuster" für Kreaturen zu erzeugen. Insbesondere möchte ich in der Lage sein, es so zu haben, dass die Zucht Elemente von den beiden Elternteilen mischt (sei es Farbe oder Elemente des Musters), so dass es nur einen zufälligen Samen nicht wirklich schneiden wird. Idealerweise benötige ich eine Art Vektor-basierter Ansatz, aber ich bin da weit von meiner Tiefe entfernt, daher würde jede Hilfe sehr geschätzt werden.

    
Niet the Dark Absol 14.02.2013, 19:42
quelle

2 Antworten

1

Ein paar Dinge fallen mir ein:

  1. Sie interpolieren die Farbwerte nicht. Um den Zakinster-Kommentar zu erweitern, interpolieren Sie die Farbindizes und runden Sie dann auf den nächsten. Ein Effekt davon ist, dass Sie mit einem Streifen gelb (Index 2) zwischen orange (Index 1) und grau (Index 3) Bereiche enden. Wenn Sie stattdessen die Farbwerte interpolieren, würden Sie vielleicht mit gräulich-orange enden?

  2. Sie haben mehr Gelb und Orange und weniger Rot und Grau im endgültigen Bild. Dies liegt daran, dass round () zum Einrasten in einen Farbindex verwendet wird. Ihre Berechnung (vor round ()) kann Floats erzeugen, die gleichmäßig zwischen 0 und 3 verteilt sind, aber das Runden wird nicht beibehalten.

Also, hier sind ein paar Vorschläge:

  1. Wenn Sie nicht auf 4 Farben beschränkt sind, verwenden Sie mehr. Interpoliere die Farbwerte (d. H. (128,0,0) gemischt mit (64,64,64) erzeugt (91,32,32)) anstelle der Indizes.

  2. Wenn Sie nur auf diese vier Farben beschränkt sind, probieren Sie eine Art Dithering aus. Ein einfacher Ansatz mit minimalen Änderungen an Ihrem Code wäre die Zufälligkeit des ausgewählten Farbindex. Also, anstatt rund (...), tue so etwas: sage, dass deine Berechnung den Wert 1,7 ergibt. Runden Sie dann auf bis zu 2 mit einer Wahrscheinlichkeit von 70% und bis zu 1 auf die anderen 30%. Dies wird die Farben mischen, aber es kann ein sehr lautes Bild erzeugen. Wenn Sie bereit sind, Ihren Code wesentlich zu ändern, lesen Sie Floyd-Steinberg zitternd .

Markku K. 25.04.2013 21:46
quelle
1

Ich weiß, dass es eine alte Frage ist, und die Antwort von @ markku-k ist korrekt, trotzdem habe ich ein ähnliches Problem und hier ist mein modifizierter Code für die Frage

mehrere Hinweise:

  1. es erzeugt 2 Bilder in einem, um "Original Matrix" und Ergebnis
  2. zu zeigen
  3. es verwendet die 8x8-Matrix, um das Ergebnis zu erzeugen, aber die tatsächliche Matrix ist 10x10, um die Grenzen abzudecken
  4. es benutzt die Farbe, um den Indexalgorithmus auf ein einfaches Delta zu färben, es funktioniert für mich

Hier ist der Code:

%Vor%

Hier ist ein Beispielergebnis:

    
Ilya Bursov 14.10.2013 22:18
quelle

Tags und Links