[
Bagian pertama ]
Setelah membahas dasar-dasarnya, pada bagian artikel ini kami menerapkan efek seperti garis besar objek, bloom, SSAO, blur, kedalaman bidang, pixelation, dan lainnya.
Garis besar
Menciptakan kontur di sekitar geometri adegan memberikan permainan tampilan yang unik yang menyerupai komik atau kartun.
Bahan difus
Shader kontur membutuhkan tekstur input untuk mengenali dan mewarnai pinggirannya. Calon untuk tekstur yang masuk dapat warna difus dari bahan, warna dari tekstur difus, vertex normal, atau bahkan warna dari peta normal.
uniform struct { vec4 diffuse ; } p3d_Material; out vec4 fragColor; void main() { vec3 diffuseColor = p3d_Material.diffuse.rgb; fragColor = vec4(diffuseColor, 1); }
Ini adalah shader fragmen kecil yang membuat warna difus dari bahan geometri menjadi tekstur penyangga bingkai. Tekstur warna difus ini dari buffer bingkai akan menjadi tekstur input untuk path shader.
Ini adalah tekstur warna bahan yang difus dari frame buffer, yang menampilkan warna yang kami atur di Blender. Shader kontur akan mengenali tepi dalam adegan dan mewarnai mereka.
Perlu dicatat bahwa warna bahan yang menyebar tidak akan berfungsi jika bagian tertentu dari pemandangan tidak memiliki warna bahan yang menyebar sendiri.
Membuat Tepian
Membuat edge mirip dengan menggunakan filter edge recognition di
GIMP .
Semua perhitungan untuk teknik naungan ini dilakukan dalam shader fragmen. Untuk membuat kontur untuk shader vertex, cukup untuk melewati empat simpul dari mesh persegi panjang ke output agar sesuai dengan layar.
Sebelum Anda mulai mengenali ujung-ujungnya, Anda perlu menyiapkan tekstur yang masuk, yang dengannya kami akan bekerja. Karena tekstur memiliki ukuran layar, kita dapat menghitung koordinat UV, mengetahui koordinat fragmen dan ukuran tekstur yang masuk.
separation
dapat disesuaikan dengan selera Anda. Semakin besar pemisahan, semakin tebal bagian tepi atau garis.
Teknik pengenalan tepi menemukan perubahan warna pada tekstur yang masuk. Berfokus pada fragmen saat ini, ia menggunakan jendela fragmen 3x3 untuk menemukan warna paling terang dan paling gelap dari sembilan sampel. Kemudian dia mengurangi kecerahan satu warna, kecerahan yang lain, mendapatkan perbedaannya.
Perbedaan ini digunakan dalam saluran alfa dari warna keluaran. Jika tidak ada perbedaan, maka tepi atau garis tidak ditarik. Jika ada perbedaan, maka ujungnya ditarik.
Coba bereksperimen dengan nilai ambang. Sekarang nol. Nilai bukan nol menjadi tepi, ambang ini dapat diubah. Ini sangat berguna untuk tekstur masuk yang ribut dengan perbedaan kecil. Dalam kasus tekstur masuk yang bising, Anda biasanya perlu membuat garis besar hanya untuk perbedaan besar.
Kode sumber
Kabut
Kabut (atau kabut, seperti yang disebut dalam Blender) menambah kabut atmosfer ke tempat kejadian, menciptakan bagian-bagian misterius yang melunak. Bagian yang menonjol muncul ketika beberapa geometri tiba-tiba jatuh ke dalam piramida visibilitas kamera.
Panda3D memiliki struktur data yang nyaman yang berisi semua parameter kabut, tetapi Anda dapat mentransfernya ke shader Anda secara manual.
Dalam contoh kode, model linier digunakan untuk menghitung kecerahan kabut saat bergerak menjauh dari kamera. Sebagai gantinya, Anda dapat menggunakan model eksponensial. Kecerahan kabut adalah nol sebelum atau di awal kabut. Ketika posisi puncak mendekati akhir kabut,
fogIntensity
mendekati kesatuan. Untuk semua simpul setelah akhir kabut,
fogIntensity
terbatas pada 1 dari atas.
Berdasarkan kecerahan kabut, kami mencampur warna kabut dengan warna output. Saat
fogIntensity
mendekati kesatuan, akan ada semakin sedikit
outputColor
dan semakin banyak warna kabut. Ketika
fogIntensity
mencapai kesatuan, hanya warna kabut yang akan tersisa.
Kabut pada kontur
Path Shader menerapkan kabut ke warna tepi untuk gambar yang lebih holistik. Jika dia tidak melakukan ini, maka geometri kontur akan dikaburkan oleh kabut, yang akan terlihat aneh. Namun, ia masih membuat kontur pada tepi terluar dari geometri panggung dengan gilingan, karena tepiannya melampaui geometri - ke tempat di mana tidak ada posisi titik.
positionTexture
adalah tekstur penyangga bingkai yang berisi posisi simpul ruang tampilan. Anda akan belajar tentang ini ketika kami menerapkan shader SSAO.
Kode sumber
Bloom
Menambahkan mekar ke pemandangan dapat membuat ilusi yang meyakinkan dari model pencahayaan. Objek yang memancarkan cahaya menjadi lebih meyakinkan, dan pantulan cahaya menerima sejumlah cahaya tambahan.
Anda dapat menyesuaikan pengaturan ini sesuai dengan keinginan Anda. Pemisahan meningkatkan ukuran blur. Sampel menentukan kekuatan blur. Ambang batas menentukan apa yang akan dan tidak akan terpengaruh oleh efek ini. Jumlah mengontrol jumlah output mekar.
Teknik ini dimulai dengan melewatkan
samples
berukuran jendela ke
samples
berpusat relatif terhadap fragmen saat ini. Sepertinya jendela yang digunakan untuk membuat jalur.
Kode ini mendapatkan warna dari tekstur yang masuk dan mengubah nilai merah, hijau, dan biru menjadi nilai dalam skala abu-abu. Jika nilai dalam skala abu-abu kurang dari ambang, maka membuang warna ini, menjadikannya hitam.
Melewati semua sampel di dalam jendela, ia mengakumulasikan semua nilainya dalam
result
.
Setelah menyelesaikan pengumpulan sampel, ia membagi jumlah sampel warna dengan jumlah sampel yang diambil. Hasilnya adalah warna tengah fragmen itu sendiri dan tetangganya. Dengan melakukannya untuk setiap fragmen, kami mendapatkan gambar buram. Jenis blur ini disebut blur kotak.
Di sini Anda melihat proses mengeksekusi algoritma bloom.
Kode sumber
Layar Space Ambient Occlusion (SSAO)
SSAO adalah salah satu efek yang Anda tidak tahu ada, tetapi begitu Anda tahu Anda tidak bisa lagi hidup tanpanya. Dia bisa mengubah adegan biasa-biasa saja menjadi yang menakjubkan! Dalam adegan statis, oklusi ambien dapat dimasukkan ke dalam tekstur, tetapi untuk adegan yang lebih dinamis kita membutuhkan shader. SSAO adalah salah satu teknik shading yang lebih canggih, tetapi begitu Anda mengetahuinya, Anda akan menjadi master shader.
Perhatikan bahwa istilah "ruang layar" dalam judul tidak sepenuhnya benar, karena tidak semua perhitungan dilakukan dalam ruang layar.
Data yang masuk
Shader SSAO akan membutuhkan input berikut.
- Vektor posisi titik di ruang tampilan.
- Vektor normal ke simpul di ruang tampilan.
- Sampel vektor dalam ruang singgung.
- Vektor kebisingan di ruang singgung.
- Matriks proyeksi pada lensa kamera.
Posisi
Tidak perlu menyimpan posisi simpul dalam tekstur frame buffer. Kami dapat membuatnya kembali dari
buffer kedalaman kamera . Saya menulis panduan untuk pemula, jadi kami tidak akan menggunakan pengoptimalan ini, dan segera memulai bisnis. Dalam implementasi Anda, Anda dapat dengan mudah menggunakan buffer kedalaman.
PT(Texture) depthTexture = new Texture("depthTexture"); depthTexture->set_format(Texture::Format::F_depth_component32); PT(GraphicsOutput) depthBuffer = graphicsOutput->make_texture_buffer("depthBuffer", 0, 0, depthTexture); depthBuffer->set_clear_color(LVecBase4f(0, 0, 0, 0)); NodePath depthCameraNP = window->make_camera(); DCAST(Camera, depthCameraNP.node())->set_lens(window->get_camera(0)->get_lens()); PT(DisplayRegion) depthBufferRegion = depthBuffer->make_display_region(0, 1, 0, 1); depthBufferRegion->set_camera(depthCameraNP);
Jika Anda memutuskan untuk menggunakan buffer kedalaman, berikut adalah cara Anda dapat mengonfigurasinya di Panda3D.
in vec4 vertexPosition; out vec4 fragColor; void main() { fragColor = vertexPosition; }
Berikut ini adalah shader sederhana untuk merender posisi simpul di ruang tampilan menjadi tekstur penyangga bingkai. Tugas yang lebih sulit adalah menyesuaikan tekstur buffer bingkai sehingga komponen-komponen vektor fragmen yang diperolehnya tidak terbatas pada interval
[0, 1]
, dan bahwa masing-masing memiliki akurasi yang cukup tinggi (jumlah bit yang cukup besar). Misalnya, jika beberapa jenis posisi vertex interpolasi adalah
<-139.444444566, 0.00000034343, 2.5>
, maka Anda tidak dapat menyimpannya ke tekstur sebagai
<0.0, 0.0, 1.0>
.
Berikut adalah contoh kode yang menyiapkan tekstur buffer bingkai untuk menyimpan posisi titik. Ia membutuhkan 32 bit untuk merah, hijau, biru dan alfa, sehingga ia menonaktifkan batasan nilai dengan interval
[0, 1]
. Panggilan ke
set_rgba_bits(32, 32, 32, 32)
mengatur volume bit dan menonaktifkan pembatasan.
glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGB32F , 1200 , 900 , 0 , GL_RGB , GL_FLOAT , nullptr );
Ini adalah panggilan serupa di OpenGL.
GL_RGB32F
menetapkan bit dan menonaktifkan pembatasan.
Jika penyangga warna memiliki koma tetap, maka komponen nilai awal dan akhir, serta indeks pencampuran, sebelum menghitung persamaan pencampuran dibatasi masing-masing untuk [0, 1] atau [β1, 1], untuk buffer warna yang dinormalisasi dan ditandatangani, ditandai dan ditandatangani. Jika buffer warna memiliki titik apung, maka batasannya tidak terpenuhi.
Sumber
Di sini Anda melihat posisi simpul; sumbu y naik.
Ingat bahwa Panda3D mendefinisikan sumbu z sebagai vektor yang mengarah ke atas, sedangkan di OpenGL sumbu y mencari ke atas. Shader posisi menampilkan posisi simpul dengan z ke atas, karena di Panda3D
parameter
gl-coordinate-system default
dikonfigurasi.
Normal
Untuk orientasi yang benar dari sampel yang diperoleh dalam shader SSAO, kita perlu normals ke simpul. Kode sampel menghasilkan beberapa vektor sampel yang didistribusikan di belahan bumi, tetapi Anda dapat menggunakan bola dan sepenuhnya menyelesaikan masalah kebutuhan akan normals.
in vec3 vertexNormal; out vec4 fragColor; void main() { vec3 normal = normalize(vertexNormal); fragColor = vec4(normal, 1); }
Seperti posisi shader, shader normal sangat sederhana. Ingatlah untuk menormalkan normals ke simpul dan ingat bahwa mereka berada di ruang pandang.
Normal ke simpul ditunjukkan di sini; sumbu y naik.
Ingat bahwa Panda3D menganggap sumbu z sebagai vektor ke atas, dan OpenGL ke sumbu y. Shader normal menampilkan posisi simpul dengan sumbu z mengarah ke atas, karena
gl-coordinate-system default
dikonfigurasikan dalam Panda3D.
Sampel
Untuk menentukan nilai oklusi ambien untuk setiap fragmen tunggal, kita perlu mengambil sampel area sekitarnya.
Kode sampel menghasilkan 64 sampel acak yang didistribusikan di belahan bumi.
ssaoSamples
ini akan diteruskan ke shader SSAO.
LVecBase3f sample = LVecBase3f ( randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) * 2.0 - 1.0 , randomFloats(generator) * 2.0 - 1.0 ).normalized();
Jika Anda ingin mendistribusikan sampel Anda di bola, maka ubah interval komponen acak z sehingga itu berubah dari minus satu ke satu.
Kebisingan
Untuk menutupi area sampel dengan baik, kita perlu menghasilkan vektor kebisingan. Vektor kebisingan ini dapat memutar sampel di sekitar bagian atas permukaan.
Oklusi ambien
SSAO menyelesaikan tugasnya dengan mengambil sampel ruang tampilan di sekitar fragmen. Semakin banyak sampel di bawah permukaan, semakin gelap warna fragmen. Sampel-sampel ini terletak di fragmen dan menunjukkan arah umum normal ke verteks. Setiap sampel digunakan untuk mencari posisi dalam tekstur posisi penyangga bingkai. Posisi yang dikembalikan dibandingkan dengan sampel. Jika sampel lebih jauh dari kamera daripada posisi, maka sampel ke arah fragmen tersumbat.
Di sini Anda melihat ruang di atas permukaan sampel untuk penyumbatan.
Seperti beberapa teknik lainnya, shader SSAO memiliki beberapa parameter kontrol yang dapat diubah untuk mendapatkan tampilan yang diinginkan. Bias ditambahkan ke jarak dari sampel ke kamera. Parameter ini dapat digunakan untuk memerangi noda. radius menambah atau mengurangi area cakupan ruang sampel. lowerRange dan upperRange mengubah rentang standar metrik faktor dari
[0, 1]
ke nilai apa pun yang Anda pilih. Dengan meningkatkan rentang, Anda dapat meningkatkan kontras.
Kami mendapatkan posisi, vektor normal dan acak untuk digunakan lebih lanjut. Ingatlah bahwa dalam contoh kode, 16 vektor acak telah dibuat. Vektor acak dipilih berdasarkan posisi layar dari fragmen saat ini.
Menggunakan vektor acak dan vektor normal, kami mengumpulkan matriks garis singgung, binormal, dan normal. Kita perlu matriks ini untuk mengubah vektor sampel dari ruang singgung ke ruang survei.
Memiliki matriks, shader dapat mengulangi semua sampel dalam loop, mengurangi jumlah yang belum dibuka.
Menggunakan matriks, tempatkan sampel di sebelah posisi vertex / fragmen dan skala dengan jari-jari.
Dengan menggunakan posisi sampel di ruang tampilan, kami mentransformasikannya dari ruang tampilan ke ruang kliping, dan kemudian ke ruang UV.
-1 * 0.5 + 0.5 = 0 1 * 0.5 + 0.5 = 1
Jangan lupa bahwa komponen ruang kliping berada dalam kisaran dari minus satu ke satu, dan koordinat UV berada dalam kisaran dari nol hingga satu. Untuk mengkonversi koordinat ruang kliping ke koordinat UV, gandakan dengan satu detik dan tambahkan satu detik.
Menggunakan koordinat offset UV yang diperoleh dengan memproyeksikan sampel 3D ke tekstur posisi 2D, kami menemukan vektor posisi yang sesuai. Ini membawa kita dari ruang tampilan ke ruang kliping ke ruang UV dan kemudian kembali ke ruang tampilan. Shader menjalankan loop ini untuk menentukan apakah ada geometri di belakang sampel, di lokasi sampel, atau di depan sampel. Jika sampel terletak di depan atau dalam beberapa geometri, maka sampel ini tidak diperhitungkan relatif terhadap fragmen yang tumpang tindih. Jika sampel berada di belakang beberapa geometri, maka sampel ini diperhitungkan relatif terhadap fragmen yang tumpang tindih.
Sekarang tambahkan bobot pada posisi sampel ini berdasarkan seberapa jauh berada di dalam atau di luar radius. Kemudian, kurangi sampel ini dari metrik oklusi karena mengasumsikan bahwa semua sampel tumpang tindih sebelum loop.
Bagilah jumlah yang tumpang tindih dengan jumlah sampel untuk mengkonversi indikator oklusi dari interval
[0, NUM_SAMPLES]
ke interval
[0, 1]
. Nol berarti oklusi lengkap, unit berarti tidak ada oklusi. Sekarang tetapkan metrik oklusi ke warna fragmen, dan hanya itu.
Harap dicatat bahwa dalam kode contoh, saluran alfa ditetapkan nilai alfa dari tekstur posisi dari buffer bingkai untuk menghindari latar belakang yang tumpang tindih.
Kabur
Tekstur frame buffer SSAO sedikit bising, jadi Anda harus mengaburkannya untuk menghaluskan.
SSAO blur shader adalah blur kotak biasa. Seperti mekar shader, ia menggambar jendela di atas tekstur yang masuk dan rata-rata setiap fragmen dengan nilai-nilai tetangganya.
Perhatikan bahwa
parameters.x
adalah parameter pemisahan.
Warna sekitar
Tantangan terakhir untuk SSAO adalah lagi dalam perhitungan pencahayaan. Di sini kita melihat bagaimana oklusi ditemukan dalam buffer tekstur SSAO tekstur dan termasuk dalam perhitungan cahaya sekitar.
Kode sumber
Kedalaman bidang
Kedalaman bidang juga merupakan efek seperti itu, setelah mempelajari tentang itu, Anda tidak dapat hidup tanpanya. Dari sudut pandang artistik, Anda dapat menggunakannya untuk menarik perhatian penonton ke objek tertentu. Tetapi dalam kasus umum, kedalaman bidang dengan biaya sedikit usaha menambah sebagian besar realisme.
Dalam fokus
Langkah pertama adalah membuat adegan sepenuhnya fokus. Render ke tekstur bingkai penyangga. Ini akan menjadi salah satu nilai input untuk kedalaman buffer bidang.
Tidak fokus
Langkah kedua adalah mengaburkan adegan seolah-olah itu benar-benar tidak fokus. Seperti halnya bloom dan SSAO, Anda bisa menggunakan box blur. Jadikan adegan ini tidak fokus ke tekstur penyangga bingkai. Ini akan menjadi nilai input lain untuk kedalaman shader bidang.
Perhatikan bahwa
parameters.x
adalah parameter pemisahan.
Kebingungan
Anda dapat menyesuaikan opsi ini sesuai selera Anda.
focalLengthSharpness
memengaruhi seberapa tidak fokusnya adegan pada focal length. Semakin kecil
focalLengthSharpness
, semakin tidak fokus adegan akan pada focal length.
blurRate
memengaruhi kecepatan mengaburkan adegan saat menjauh dari focal length. Semakin kecil
blurRate
, semakin tidak buram pemandangan saat
blurRate
dari titik fokus.
Kita akan membutuhkan warna dalam fokus dan gambar yang tidak fokus.
Kita juga mungkin membutuhkan posisi titik di ruang tampilan. Anda dapat menerapkan kembali tekstur posisi dari penyangga bingkai yang digunakan untuk SSAO.
Dan di sini kebingungan terjadi. Semakin dekat blur
satu, semakin banyak yang akan digunakan outOfFocusColor
. Nilai nol blur
berarti bahwa fragmen ini sepenuhnya dalam fokus. Dengan blur >= 1
fragmen ini benar-benar tidak fokus.Kode sumber
Posterisasi
Posterisasi, atau sampling warna, adalah proses mengurangi jumlah warna unik dalam suatu gambar. Anda dapat menggunakan shader ini untuk memberikan permainan komik atau tampilan retro. Jika Anda menggabungkannya dengan garis besar, Anda mendapatkan gaya kartun yang nyata.
Anda dapat bereksperimen dengan parameter ini. Semakin besar, semakin banyak bunga yang tersisa.
Kami akan membutuhkan warna yang masuk.
Saya belum melihat metode posterisasi seperti itu. Setelah memeriksanya, saya melihat bahwa itu menciptakan hasil yang lebih indah dibandingkan dengan metode konvensional. Untuk mengurangi palet warna, pertama-tama konversikan warna ke nilai dalam skala abu-abu. Kami mendiskritasikan warnanya dengan mengikatnya ke salah satu level. Kami menghitung perbedaan antara nilai yang didiskritisasi dalam skala abu-abu dan nilai yang tidak didiskritisasi dalam skala abu-abu. Tambahkan perbedaan ini ke warna input. Perbedaan ini adalah jumlah di mana warna harus naik / turun untuk mencapai nilai diskritisasi dalam skala abu-abu.
Jangan lupa untuk menetapkan nilai warna input ke warna fragmen.Cel shading
Posterisasi dapat membuat gambar tampak seperti cel shading, karena cel shading adalah proses mendiskritasikan warna difus dan difus menjadi warna diskrit. Kami hanya ingin menggunakan warna difus padat tanpa detail peta normal dan nilai kecil levels
.Kode sumber
Pixelisasi
Pixelisasi game 3D dapat memberikan tampilan yang menarik, atau dapat menghemat waktu Anda untuk membuat semua seni pixel secara manual. Gabungkan dengan posterisasi untuk menciptakan tampilan retro yang benar.
Anda dapat mengatur sendiri ukuran pikselnya. Semakin besar, semakin kasar gambarnya.
Teknik ini menempelkan setiap fragmen ke tengah jendela berukuran piksel terdekat yang tidak tumpang tindih. Jendela-jendela ini berbaris di atas tekstur yang masuk. Fragmen di tengah jendela menentukan warna fragmen lain di jendela mereka.
Setelah kami menentukan koordinat fragmen yang diinginkan untuk digunakan, ambil warnanya dari tekstur yang masuk dan tetapkan ke warna fragmen.Kode sumber
Pertajam
Efek mempertajam (menajamkan) meningkatkan kontras di tepi gambar. Ini sangat berguna ketika grafik ternyata terlalu lunak.
Dengan mengubah nilainya, kita dapat mengontrol besarnya ketajaman hasilnya. Jika nilainya nol, gambar tidak akan berubah. Dengan nilai negatif, gambar mulai terlihat aneh.
Fragmen yang berdekatan dikalikan dengan amount * -1
. Fragmen saat ini dikalikan dengan amount * 4 + 1
.
Fragmen tetangga ada di atas, bawah, kiri dan kanan. Setelah mengalikan tetangga dan fragmen saat ini dengan nilainya, hasilnya ditambahkan.
Jumlah ini adalah warna akhir dari fragmen.Kode sumber
Butir film
Butiran film (dalam dosis kecil, dan tidak seperti dalam contoh) dapat menambahkan realisme, yang tidak terlihat sampai efek ini dihilangkan. Biasanya ini adalah ketidaksempurnaan yang membuat gambar yang dihasilkan secara digital lebih meyakinkan.Perhatikan bahwa butiran film biasanya merupakan efek terakhir yang diterapkan pada bingkai sebelum ditampilkan.Nilai
amount
mengontrol visibilitas butir film. Semakin tinggi nilainya, semakin banyak "salju" dalam gambar.Kecerahan acak
Sepotong kode ini menghitung kecerahan acak yang diperlukan untuk menyesuaikan nilainya. Time Since F1 = 00 01 02 03 04 05 06 07 08 09 10 Frame Number = F1 F3 F4 F5 F6 osg_FrameTime = 00 02 04 07 08
Nilai yang osg_FrameTime
diberikan oleh Panda3D. Waktu bingkai adalah cap waktu dengan informasi tentang berapa detik telah berlalu sejak bingkai pertama. Kode sampel menggunakannya untuk menghidupkan butir film, yang osg_FrameTime
akan berbeda di setiap frame.
Untuk butiran statis, film harus diganti dengan osg_FrameTime
jumlah besar. Untuk menghindari melihat pola, Anda dapat mencoba angka yang berbeda.
Untuk membuat titik, atau bintik-bintik butiran film, digunakan koordinat, dan x, dan y. Jika Anda menggunakan x, maka hanya garis vertikal yang akan ditampilkan, jika Anda menggunakan y, maka hanya garis horizontal yang akan ditampilkan.Dalam kode, satu koordinat dikalikan dengan yang lain untuk menghancurkan simetri diagonal.Tentu saja, Anda dapat menghilangkan multiplier koordinat, dan mendapatkan efek hujan yang sepenuhnya dapat diterima.Perhatikan bahwa untuk menghidupkan efek hujan, gandakan hasilnya sin
dengan osg_FrameTime
.Percobaan dengan koordinat x dan y untuk mengubah arah hujan. Untuk mandi bawah, hanya menyisakan koordinat x. input = (gl_FragCoord.x + gl_FragCoord.y * osg_FrameTime) * toRadians frame(10000 * sin(input)) = fract(10000 * sin(6.977777777777778)) = fract(10000 * 0.6400723818964882) =
sin
digunakan sebagai fungsi hash. Koordinat fragmen di hash dengan nilai output sin
. Berkat ini, properti nyaman muncul - apa pun data input (besar atau kecil), interval output akan berada dalam kisaran dari minus satu hingga satu. fract(10000 * sin(6.977777777777778)) = fract(10000 * 0.6400723818964882) = fract(6400.723818964882) = 0.723818964882
sin
dalam kombinasi dengan fract
juga digunakan sebagai generator angka acak semu. >>> [floor(fract(4 * sin(x * toRadians)) * 10) for x in range(0, 10)] [0, 0, 1, 2, 2, 3, 4, 4, 5, 6] >>> [floor(fract(10000 * sin(x * toRadians)) * 10) for x in range(0, 10)] [0, 4, 8, 0, 2, 1, 7, 0, 0, 5]
Pertama lihat pada baris pertama angka, dan kemudian pada yang kedua. Setiap baris ditentukan, tetapi polanya kurang terlihat di baris kedua daripada di baris kedua. Oleh karena itu, terlepas dari kenyataan bahwa output bersifat fract(10000 * sin(...))
deterministik, polanya diakui jauh lebih lemah.Di sini kita melihat bagaimana faktornya sin
adalah pertama 1, lalu 10, lalu 100, dan kemudian 1000.Ketika pengali dari nilai output meningkat, sin
polanya menjadi kurang terlihat. Karena alasan ini, kode sin
ini dikalikan 10.000.Warna fragmen
Ubah koordinat fragmen menjadi koordinat UV. Menggunakan koordinat UV ini, kami mencari warna tekstur untuk fragmen saat ini.
Ubah nilainya menjadi kecerahan acak dan tambahkan ke warna.
Atur warna fragmen, dan hanya itu.Kode sumber
Ucapan Terima Kasih