Cat di dinding di kamar saya memiliki tekstur 3 dimensi acak, hampir seperti fraktal:
Dalam tantangan ini, Anda akan menulis sebuah program yang menghasilkan gambar acak yang terlihat seperti bagian dari dinding saya.
Di bawah ini saya telah mengumpulkan 10 gambar tempat yang berbeda di dinding saya. Semua memiliki pencahayaan yang kira-kira sama dan semuanya diambil dengan kamera satu kaki dari dinding. Perbatasan dipotong secara merata untuk menjadikannya 2048 kali 2048 piksel, kemudian ditingkatkan menjadi 512 kali 512. Gambar di atas adalah gambar A.
Ini hanya thumbnail, klik gambar untuk melihat ukuran penuh!
Tugas Anda adalah menulis sebuah program yang menggunakan bilangan bulat positif dari 1 hingga 2 16 sebagai seed acak, dan untuk setiap nilai menghasilkan gambar yang berbeda yang kelihatannya bisa menjadi "gambar kesebelas" dari dinding saya. Jika seseorang melihat 10 gambar saya dan beberapa dari Anda tidak dapat membedakan mana yang dihasilkan komputer maka Anda telah melakukannya dengan sangat baik!
Harap pamerkan beberapa gambar yang Anda buat sehingga pemirsa dapat melihatnya tanpa harus menjalankan kode.
Saya menyadari bahwa pencahayaan dalam gambar saya tidak seragam sempurna dalam intensitas atau warna. Saya minta maaf untuk ini tetapi itu yang terbaik yang bisa saya lakukan tanpa peralatan pencahayaan yang lebih baik. Gambar Anda tidak perlu memiliki pencahayaan variabel (meskipun mereka bisa). Tekstur adalah hal yang lebih penting untuk difokuskan.
Detail
- Anda dapat menggunakan alat dan perpustakaan pengolah gambar.
- Ambil input dengan cara umum yang Anda inginkan (baris perintah, stdin, variabel yang jelas, dll).
- Gambar output dapat dalam format file gambar lossless umum, atau hanya dapat ditampilkan di jendela / bowser.
- Anda dapat menganalisis 10 gambar saya secara terprogram tetapi jangan berasumsi bahwa semua orang yang menjalankan kode Anda memiliki akses ke gambar itu.
- Anda harus menghasilkan gambar secara terprogram. Anda tidak boleh membuat hard-code varian sedikit dari salah satu gambar saya atau gambar stok lainnya. (Lagi pula, orang akan memilih Anda untuk ini.)
- Anda dapat menggunakan generator nomor pseudorandom bawaan dan menganggap periode adalah 16 16 atau lebih.
Mencetak gol
Ini adalah kontes popularitas sehingga jawaban dengan suara terbanyak menang.
sumber
Jawaban:
GLSL (+ JavaScript + WebGL)
Demo langsung | Repositori GitHub
Cara Penggunaan
Muat ulang halaman untuk gambar acak baru. Jika Anda ingin memberi makan di seed tertentu, buka konsol browser Anda dan panggil
drawScreen(seed)
. Konsol harus menampilkan benih yang digunakan saat memuat.Saya belum benar-benar menguji ini pada banyak platform, jadi beri tahu saya jika itu tidak berhasil untuk Anda. Tentu saja, browser Anda perlu mendukung WebGL. Kesalahan ditampilkan baik di kolom di sebelah kiri, atau di konsol browser (tergantung pada jenis kesalahan).
Baru: Sekarang Anda dapat menghidupkan sedikit dinding, dengan mencentang kotak "sumber cahaya bergerak".
Apa sihir ini?
Saya punya kode boilerplate WebGL ini mengambang di sekitar akun GitHub saya , yang saya gunakan setiap sekarang dan kemudian dengan cepat membuat prototipe beberapa hal grafis 2D di WebGL. Dengan beberapa shader magic, kita juga bisa membuatnya terlihat sedikit 3D, jadi saya pikir itu cara tercepat untuk mendapatkan beberapa efek yang bagus. Sebagian besar penyiapan berasal dari kode boilerplate itu, dan saya sedang mempertimbangkan pustaka untuk pengiriman ini dan tidak akan memasukkannya dalam posting ini. Jika Anda tertarik, lihat main.js di GitHub (dan file lain di folder itu).
Semua yang dilakukan JavaScript adalah mengatur konteks WebGL, menyimpan seed dalam seragam untuk shader, dan kemudian membuat quad tunggal di seluruh konteks. Vertex shader adalah shader passthrough sederhana, sehingga semua keajaiban terjadi dalam fragmen shader. Itu sebabnya saya menyebut ini pengiriman GLSL.
Bagian terbesar dari kode sebenarnya adalah untuk menghasilkan noise Simplex, yang saya temukan di GitHub . Jadi saya menghilangkan itu juga dalam daftar kode di bawah ini. Bagian yang penting adalah, ia mendefinisikan fungsi
snoise(vec2 coords)
yang mengembalikan noise simplex tanpa menggunakan pencarian tekstur atau array. Ini tidak diunggulkan sama sekali, jadi trik untuk mendapatkan suara yang berbeda adalah dengan menggunakan benih dalam menentukan di mana harus melakukan pencarian.Jadi begini:
Itu dia. Saya mungkin menambahkan beberapa penjelasan lagi besok, tetapi ide dasarnya adalah:
tanh
untuk naik dari atas.sumber
Mathematica Spackling
Aplikasi di bawah ini berlaku speckling ke gambar acak. Mengklik "tambalan baru" menghasilkan gambar acak baru untuk bekerja, dan kemudian menerapkan efek sesuai dengan pengaturan saat ini. Efeknya adalah lukisan minyak, filter Gaussian, posterisasi, dan embossing. Setiap efek dapat di-tweak secara independen. Benih untuk pembangkit bilangan acak dapat berupa bilangan bulat dari 1 hingga 2 ^ 16.
Pembaruan : Filter Gaussian, yang melembutkan tepi, sekarang merupakan efek gambar terakhir yang diterapkan. Dengan modifikasi ini, efek posterisasi tidak lagi diperlukan dan karenanya dihilangkan.
Penjelasan
Penjelasannya didasarkan pada versi yang sedikit berbeda, di mana posterisasi digunakan dan
GaussianFilter
diterapkan sejak awal. Tetapi masih berfungsi untuk memperjelas bagaimana setiap efek gambar mengubah gambar. Hasil akhirnya adalah tekstur cat dengan tepi yang lebih tajam. Ketika filter Gaussian hanya diterapkan di akhir, hasilnya akan lebih halus, seperti yang ditunjukkan gambar di atas.Mari kita lihat beberapa efek gambar, satu per satu.
Buat gambar awal.
Lena akan menunjukkan kepada kita bagaimana setiap efek gambar mengubah gambar yang hidup.
Efek lukisan cat minyak diterapkan pada Lena.
Efek lukisan cat minyak diterapkan pada gambar acak kami. Efeknya diintensifkan (16 bukannya 8).
Efek filter Gaussian diterapkan pada Lena (bukan ke versi efek lukisan cat minyak Lena). Radiusnya 10 piksel. (Dalam versi final, di bagian atas entri ini, GaussianFilter diterapkan sebagai efek akhir.)
Efek filter Gaussian yang agak lebih ringan diterapkan ke r1. Radiusnya adalah 5 piksel.
Efek posterisasi intens diterapkan pada Lena. (Dalam versi final aplikasi, saya menghapus posterisasi. Tetapi kita akan membiarkannya dalam analisis, karena contoh-contoh dalam analisis didasarkan pada versi sebelumnya dengan posterisasi.)
Efek posterisasi diterapkan pada r2.
Lena timbul
Embossing r3 melengkapi pemrosesan gambar. Ini dimaksudkan agar terlihat seperti langit-langit OP.
Bagi yang penasaran, inilah Lena dengan efek gambar yang sama diterapkan.
sumber
RandomInteger
benih, sehingga menjamin output tertentu. Atau maksud Anda sesuatu yang lain, seperti gambar awal, non-acak yang efeknya diterapkan?Lena will show us how each image effect transforms a life-like picture
membuat saya LOL. Yang aneh adalah, gambar Lena terakhir tampaknya memiliki Aztec atau Inca menghadap ke kiri, mengenakan hiasan kepala dan membuat ranting seolah-olah itu adalah pistol.POV-Ray
Banyak potensi bermain golf, jalankan bersama
povray /RENDER wall.pov -h512 -w512 -K234543
Pertama itu menciptakan tekstur acak, tetapi bukannya berhenti di sana itu mengubah tekstur menjadi bidang ketinggian 3D untuk membuat bayangan radial dari flash kamera lebih realistis. Dan untuk ukuran yang baik itu menambahkan tekstur gundukan kecil di atasnya.
Satu-satunya cara selain dari hardcoding benih acak adalah dengan menggunakan
clock
variabel yang dimaksudkan untuk animasi, ini dilewatkan dengan-K{number}
benderasumber