Farba na ścianach w moim pokoju ma losową, prawie fraktalną, trójwymiarową teksturę:
W tym wyzwaniu napiszesz program, który generuje losowe obrazy, które wyglądają, jakby mogły być częścią moich ścian.
Poniżej zebrałem 10 zdjęć różnych miejsc na moich ścianach. Wszystkie mają w przybliżeniu to samo oświetlenie i wszystkie zostały zrobione aparatem jedną stopę od ściany. Obramowania zostały równomiernie przycięte, aby uzyskać 2048 na 2048 pikseli, a następnie zostały skalowane do 512 na 512. Powyższy obraz to obraz A.
To tylko miniatury, kliknij obrazy, aby wyświetlić w pełnym rozmiarze!
Twoim zadaniem jest napisanie programu, który przyjmuje losową liczbę całkowitą od 1 do 2 16 jako losowe ziarno, i dla każdej wartości generuje odrębny obraz, który wygląda, jakby mógł być „jedenastym obrazem” mojej ściany. Jeśli ktoś patrzy na moje 10 zdjęć i kilka z nich nie wie, które zostały wygenerowane komputerowo, to poradziłeś sobie bardzo dobrze!
Pochwal się kilkoma wygenerowanymi obrazami, aby widzowie mogli je zobaczyć bez konieczności uruchamiania kodu.
Zdaję sobie sprawę, że oświetlenie na moich obrazach nie jest idealnie jednolite pod względem intensywności ani kolorów. Przykro mi z tego powodu, ale to najlepsze, co mogłem zrobić bez lepszego sprzętu oświetleniowego. Twoje zdjęcia nie muszą mieć zmiennego oświetlenia (choć mogłyby). Faktura jest najważniejszą rzeczą, na której należy się skupić.
Detale
- Możesz korzystać z narzędzi do przetwarzania obrazów i bibliotek.
- Podaj dane wejściowe w dowolny sposób (wiersz poleceń, standardowe, oczywiste zmienne itp.).
- Obraz wyjściowy może być w dowolnym typowym formacie pliku bezstratnego lub może być po prostu wyświetlany w oknie / dziurkaczu.
- Możesz programowo analizować moje 10 obrazów, ale nie zakładaj, że każdy, kto uruchamia Twój kod, ma do nich dostęp.
- Musisz wygenerować obrazy programowo. Nie możesz zakodować na stałe niewielkiego wariantu jednego z moich obrazów lub innego obrazu podstawowego. (Ludzie i tak by za to głosowali).
- Możesz użyć wbudowanych generatorów liczb pseudolosowych i założyć, że okres wynosi 2 16 lub więcej.
Punktacja
To konkurs popularności, dlatego wygrywa odpowiedź, która uzyskała najwyższy głos.
źródło
Odpowiedzi:
GLSL (+ JavaScript + WebGL)
Demo na żywo | Repozytorium GitHub
Jak używać
Załaduj stronę ponownie, aby uzyskać nowy losowy obraz. Jeśli chcesz nakarmić określone ziarno, otwórz konsolę przeglądarki i zadzwoń
drawScreen(seed)
. Konsola powinna wyświetlać ziarno użyte podczas ładowania.Tak naprawdę nie testowałem tego na wielu platformach, więc daj mi znać, jeśli to nie zadziała. Oczywiście Twoja przeglądarka musi obsługiwać WebGL. Błędy są wyświetlane w kolumnie po lewej stronie lub w konsoli przeglądarki (w zależności od rodzaju błędu).
Nowość: Możesz teraz ożywić ściany, zaznaczając pole wyboru „ruchome źródło światła”.
Co to za czary?
Mam ten kod bojlera WebGL pływający wokół mojego konta GitHub , którego od czasu do czasu używam do szybkiego prototypowania niektórych elementów grafiki 2D w WebGL. Dzięki magii shaderów możemy sprawić, że będzie wyglądać nieco 3D, więc pomyślałem, że to najszybszy sposób na uzyskanie fajnych efektów. Większość ustawień pochodzi z tego kodu i zastanawiam się, czy biblioteka tego zgłoszenia nie będzie go zawierać w tym poście. Jeśli jesteś zainteresowany, spójrz na main.js na GitHub (i inne pliki w tym folderze).
Wszystko, co robi JavaScript, to skonfigurowanie kontekstu WebGL, zapisanie ziarna w mundurze dla modułu cieniującego, a następnie renderowanie pojedynczego kwadratu w całym kontekście. Moduł cieniujący wierzchołek jest prostym modułem cieniującym przechodzącym, więc cała magia dzieje się w module cieniującym fragmenty. Dlatego nazwałem to zgłoszeniem GLSL.
Największa część kodu to tak naprawdę generowanie szumu Simplex, który znalazłem na GitHub . Więc pomijam to również w poniższej liście kodów. Ważną częścią jest to, że definiuje funkcję,
snoise(vec2 coords)
która zwraca szum simpleks bez użycia tekstury lub tablicy. W ogóle nie jest rozstawiony, więc sztuczka w uzyskaniu innego hałasu polega na użyciu nasion w celu ustalenia, gdzie należy przeprowadzić wyszukiwanie.Więc oto idzie:
Otóż to. Jutro mogę dodać więcej wyjaśnień, ale podstawową ideą jest:
tanh
aby wyrównać górę.źródło
Mathematica Spackling
Poniższa aplikacja stosuje plamki do losowego obrazu. Kliknięcie „nowej poprawki” generuje nowy losowy obraz do pracy, a następnie stosuje efekty zgodnie z bieżącymi ustawieniami. Efekty to malarstwo olejne, filtr Gaussa, posteryzacja i wytłaczanie. Każdy efekt można niezależnie modyfikować. Ziarno generatora liczb losowych może być dowolną liczbą całkowitą od 1 do 2 ^ 16.
Aktualizacja : Filtr Gaussa, który zmiękcza krawędzie, jest teraz ostatnim zastosowanym efektem obrazu. Dzięki tej modyfikacji efekt posteryzacji nie był już potrzebny i został usunięty.
Wyjaśnienie
Wyjaśnienie opiera się na nieco innej wersji, w której zastosowano posteryzację i
GaussianFilter
zastosowano ją wcześnie. Ale nadal służy wyjaśnieniu, w jaki sposób każdy efekt obrazu zmienia obraz. Efektem końcowym jest tekstura farby z ostrzejszymi krawędziami. Gdy filtr Gaussa zostanie zastosowany tylko na końcu, wynik będzie gładszy, jak pokazuje powyższy obrazek.Przyjrzyjmy się niektórym efektom obrazu, pojedynczo.
Wygeneruj obraz początkowy.
Lena pokaże nam, jak każdy efekt obrazu przekształca obraz podobny do życia.
Efekt malarstwa olejnego zastosowany do Leny.
Efekt malowania olejem zastosowany do naszego losowego obrazu. Efekt został zintensyfikowany (16 zamiast 8).
Efekt filtru gaussowskiego zastosowany do Leny (nie do wersji Leny z efektem malowania olejów). Promień wynosi 10 pikseli. (W ostatecznej wersji u góry tego wpisu GaussianFilter jest stosowany jako efekt końcowy.)
Nieco łagodniejszy efekt filtra Gaussa zastosowany do r1. Promień wynosi 5 pikseli.
Intensywny efekt posteryzacji zastosowany wobec Leny. (W ostatecznej wersji aplikacji usunąłem posteryzację. Ale zostawimy to w analizie, ponieważ przykłady w analizie były oparte na wcześniejszej wersji z posteryzacją).
Efekt posteryzacji zastosowany do r2.
Tłoczenie Lena
Tłoczenie r3 kończy przetwarzanie obrazu. Ma to wyglądać podobnie do sufitu PO.
Dla ciekawskich oto Lena z zastosowanymi tymi samymi efektami obrazu.
źródło
RandomInteger
ziarno, gwarantując w ten sposób szczególną wydajność. Czy masz na myśli coś innego, na przykład początkowy, nieprzypadkowy obraz, do którego zastosowano efekty?Lena will show us how each image effect transforms a life-like picture
sprawiło, że LOL. Dziwne jest to, że na ostatecznym zdjęciu Leny widać Azteków lub Inków skierowanych w lewo, ubranych w nakrycie głowy i zbierających gałązkę, jakby to była broń.POV-Ray
Biegaj z dużym potencjałem golfowym
povray /RENDER wall.pov -h512 -w512 -K234543
Najpierw tworzy losową teksturę, ale zamiast się tam zatrzymać, przekształca teksturę w pole o wysokości 3D, aby promieniowanie cienia z lampy błyskowej aparatu było bardziej realistyczne. I na dokładkę dodaje kolejną teksturę małych guzków na górze.
Jedynym sposobem poza zakodowaniem losowego materiału siewnego jest użycie
clock
zmiennej przeznaczonej do animacji, która jest przekazywana z-K{number}
flagąźródło