Selamat Datang di Bahasa Shading Terbuka!
Open Shading Language (OSL) adalah bahasa kecil namun kaya untuk bayangan yang dapat diprogram dalam penyaji tingkat lanjut dan aplikasi lainnya, ideal untuk mendeskripsikan material, cahaya, perpindahan, dan pembuatan pola.
OSL awalnya dikembangkan oleh Sony Pictures Imageworks untuk digunakan dalam penyaji in-house yang digunakan untuk animasi film layar lebar dan efek visual, dirilis sebagai sumber terbuka sehingga dapat digunakan oleh studio efek visual dan animasi lainnya serta vendor perangkat lunak rendering. Sekarang ini adalah bahasa arsir standar de facto untuk VFX dan fitur animasi, yang digunakan di seluruh industri pada banyak perender komersial dan milik studio. Oleh karena itu, pengerjaan OSL mendapat Academy Award for Technical Achievement pada tahun 2017.
OSL kuat dan terbukti dalam produksi, dan telah digunakan dalam berbagai film seperti "The Amazing Spider-Man", "Hotel Transylvania", "Edge of Tomorrow", "Ant Man", "Finding Dory", dan banyak lagi. Dukungan OSL ada di sebagian besar perender terkemuka yang digunakan untuk pekerjaan VFX dan animasi kelas atas. Untuk daftar lengkap film dan produk, lihat filmografinya.
Kode OSL didistribusikan di bawah lisensi "New/3-clause BSD", dan dokumentasinya di bawah Lisensi Internasional Creative Commons Attribution 4.0. Singkatnya, Anda bebas menggunakan OSL dalam aplikasi Anda sendiri, baik gratis atau komersial, terbuka atau kepemilikan, serta memodifikasi kode dan dokumentasi OSL sesuai keinginan Anda, asalkan Anda tetap mempertahankan pemberitahuan hak cipta asli seperti yang dijelaskan dalam lisensi.
OSL memiliki sintaks yang mirip dengan C, serta bahasa bayangan lainnya. Namun, ini dirancang khusus untuk algoritme rendering tingkat lanjut dan memiliki fitur seperti penutupan pancaran, BSDF, dan penelusuran sinar yang ditangguhkan sebagai konsep kelas satu.
OSL memiliki beberapa karakteristik unik yang tidak ditemukan pada bahasa shading lainnya (tentu saja tidak semuanya). Berikut beberapa hal yang akan Anda temukan berbeda di OSL dibandingkan dengan bahasa lain:
Shader permukaan dan volume menghitung penutupan pancaran, bukan warna akhir.
Shader permukaan dan volume OSL menghitung deskripsi simbolis eksplisit, yang disebut "penutupan", tentang cara permukaan atau volume menghamburkan cahaya, dalam satuan pancaran. Penutupan pancaran ini dapat dievaluasi dalam arah tertentu, diambil sampelnya untuk menemukan arah penting, atau disimpan untuk evaluasi dan evaluasi ulang nanti. Pendekatan baru ini ideal untuk penyaji berbasis fisik yang mendukung penelusuran sinar dan iluminasi global.
Sebaliknya, bahasa peneduh lainnya biasanya hanya menghitung warna permukaan yang terlihat dari arah tertentu. Shader lama ini adalah "kotak hitam" yang tidak dapat dilakukan penyaji selain mengeksekusinya untuk menemukan satu informasi ini (misalnya, tidak ada cara efektif untuk mengetahui arah mana yang penting untuk diambil sampelnya). Selain itu, unit fisik lampu dan permukaan sering kali tidak ditentukan secara spesifik, sehingga sangat sulit untuk memastikan bahwa shader berperilaku benar secara fisik.
Shader permukaan dan volume tidak mengelilingi lampu atau menembakkan sinar.
Tidak ada "loop cahaya" atau sinar iluminasi yang terlacak secara eksplisit di shader permukaan OSL. Sebaliknya, shader permukaan menghitung penutupan pancaran yang menggambarkan bagaimana permukaan menghamburkan cahaya, dan bagian dari penyaji yang disebut "integrator" mengevaluasi penutupan untuk sekumpulan sumber cahaya tertentu dan menentukan ke arah mana sinar harus dilacak. Efek yang biasanya memerlukan penelusuran sinar eksplisit, seperti refleksi dan refraksi, hanyalah bagian dari penutupan pancaran dan terlihat seperti BSDF lainnya.
Keuntungan dari pendekatan ini mencakup bahwa integrasi dan pengambilan sampel dapat dilakukan secara batch atau disusun ulang untuk meningkatkan koherensi sinar; sebuah "ray budget" dapat dialokasikan untuk mengambil sampel BSDF secara optimal; penutupan dapat digunakan untuk penelusuran sinar dua arah atau transportasi ringan Metropolis; dan penutupan dapat dengan cepat dievaluasi ulang dengan pencahayaan baru tanpa harus menjalankan kembali shader.
Surface dan light shader adalah hal yang sama.
OSL tidak memiliki jenis shader terpisah untuk sumber cahaya. Lampu hanyalah permukaan yang memancarkan cahaya, dan semua lampu adalah lampu area.
Transparansi hanyalah jenis penerangan lainnya.
Anda tidak perlu mengatur variabel transparansi/opasitas secara eksplisit di shader. Transparansi hanyalah cara lain bagi cahaya untuk berinteraksi dengan suatu permukaan, dan termasuk dalam penutupan pancaran utama yang dihitung oleh shader permukaan.
Output perender (AOV) dapat ditentukan menggunakan "ekspresi jalur cahaya".
Kadang-kadang diinginkan untuk mengeluarkan gambar yang mengandung komponen pencahayaan individual seperti specular, difus, refleksi, lampu individual, dll. Dalam bahasa lain, hal ini biasanya dilakukan dengan menambahkan sejumlah besar "variabel keluaran" ke shader yang mengumpulkan kuantitas individual ini.
Shader OSL tidak perlu dipenuhi dengan kode atau variabel keluaran apa pun untuk mencapai hal ini. Sebaliknya, terdapat notasi berbasis ekspresi reguler untuk menjelaskan jalur cahaya mana yang harus berkontribusi pada keluaran tertentu. Ini semua dilakukan di sisi penyaji (meskipun didukung oleh implementasi OSL). Jika Anda menginginkan keluaran baru, tidak perlu memodifikasi shader sama sekali; Anda hanya perlu memberi tahu penyaji ekspresi jalur cahaya yang baru.
Shader disusun dalam jaringan.
OSL shader tidak bersifat monolitik, melainkan dapat diatur ke dalam jaringan shader (terkadang disebut grup shader, grafik, atau DAG), dengan keluaran bernama dari beberapa node dihubungkan ke masukan bernama dari node lain dalam jaringan. Koneksi ini dapat dilakukan secara dinamis pada waktu render, dan tidak memengaruhi kompilasi masing-masing node shader. Selain itu, masing-masing node dievaluasi dengan malas, hanya ketika keluarannya "ditarik" dari node selanjutnya yang bergantung padanya (penulis shader mungkin tetap tidak menyadari detail ini, dan menulis shader seolah-olah semuanya dievaluasi secara normal).
Turunan sewenang-wenang tanpa kisi atau titik bayangan tambahan.
Di OSL, Anda dapat mengambil turunan dari kuantitas apa pun yang dihitung dalam shader, dan menggunakan kuantitas arbitrer sebagai koordinat tekstur dan mengharapkan pemfilteran yang benar. Hal ini tidak mengharuskan titik-titik yang diarsir disusun dalam kotak persegi panjang, atau memiliki konektivitas tertentu, atau "titik tambahan" apa pun diarsir. Hal ini karena turunan tidak dihitung berdasarkan perbedaan hingga dengan titik-titik tetangga, melainkan dengan "diferensiasi otomatis", yang menghitung perbedaan parsial untuk variabel yang menghasilkan turunan, tanpa intervensi apa pun yang diperlukan oleh penulis shader.
OSL mengoptimalkan secara agresif pada waktu render
OSL menggunakan kerangka kompiler LLVM untuk menerjemahkan jaringan shader ke dalam kode mesin dengan cepat (just in time, atau "JIT"), dan dalam prosesnya sangat mengoptimalkan shader dan jaringan dengan pengetahuan penuh tentang parameter shader dan nilai runtime lainnya yang tidak dapat dilakukan. telah diketahui ketika shader dikompilasi dari kode sumber. Hasilnya, kami melihat jaringan peneduh OSL kami bekerja 25% lebih cepat dibandingkan shader serupa yang dibuat dengan tangan di C! (Begitulah cara kerja shader lama kami di renderer kami.)
Distribusi open source OSL terdiri dari komponen-komponen berikut:
oslc, kompiler mandiri yang menerjemahkan kode sumber OSL menjadi kode perantara seperti perakitan (dalam bentuk file .oso).
liboslc, perpustakaan yang mengimplementasikan kelas OSLCompiler, yang berisi inti dari kompiler shader, jika ada orang yang perlu menyematkannya ke aplikasi lain dan tidak ingin kompiler tersebut dapat dieksekusi secara terpisah.
liboslquery, perpustakaan yang mengimplementasikan kelas OSLQuery, yang memungkinkan aplikasi menanyakan informasi tentang shader yang dikompilasi, termasuk daftar lengkap parameternya, tipenya, dan metadata apa pun yang terkait dengannya.
oslinfo, program baris perintah yang menggunakan liboslquery untuk mencetak ke konsol semua informasi relevan tentang shader dan parameternya.
liboslexec, perpustakaan yang mengimplementasikan kelas ShadingSystem, yang memungkinkan shader terkompilasi dieksekusi dalam suatu aplikasi. Saat ini, ia menggunakan LLVM untuk mengkompilasi JIT bytecode shader ke instruksi x86.
testshade, sebuah program yang memungkinkan Anda menjalankan shader (atau jaringan shader yang terhubung) pada array titik persegi panjang, dan menyimpan outputnya sebagai gambar. Hal ini memungkinkan verifikasi shader (dan sistem bayangan) tanpa perlu diintegrasikan ke dalam renderer yang berfungsi penuh, dan merupakan dasar bagi sebagian besar verifikasi testsuite kami. Bersamaan dengan testrender, testshade adalah contoh bagus tentang cara memanggil perpustakaan OSL.
testrender, penyaji ray-tracing kecil yang menggunakan OSL untuk bayangan. Fitur-fiturnya sangat minim (hanya lingkup yang diizinkan pada saat ini) dan tidak ada perhatian terhadap kinerja, namun ini menunjukkan bagaimana pustaka OSL dapat diintegrasikan ke dalam penyaji yang berfungsi, antarmuka apa yang perlu disediakan oleh penyaji, dan bagaimana BSDF/ penutupan pancaran harus dievaluasi dan diintegrasikan (termasuk dengan pengambilan sampel yang sangat penting).
Beberapa contoh shader.
Dokumentasi -- saat ini terdiri dari spesifikasi bahasa OSL (berguna untuk penulis shader), namun di masa mendatang akan memiliki dokumentasi terperinci tentang cara mengintegrasikan perpustakaan OSL ke dalam penyaji.
Daftar ini hanya berisi film atau produk yang penggunaan OSL-nya disebutkan atau dapat disimpulkan dari sumber publik, atau yang telah diberitahukan kepada kami boleh untuk dicantumkan di sini. Jika proyek yang menggunakan OSL hilang dan itu bukan rahasia, cukup kirim email ke pemimpin proyek OSL atau kirimkan PR dengan editan pada file ini.
(Dalam urutan perkiraan penambahan dukungan OSL)
(Di sini yang dimaksud dengan "pekerjaan penting" adalah film layar lebar yang dirilis di bioskop atau di platform streaming besar, serial TV/streaming yang banyak menampilkan efek visual atau animasi, atau film pendek yang telah memenangkan atau dinominasikan untuk penghargaan besar.)
Silakan baca file INSTALL.md untuk petunjuk rinci tentang cara membangun dan menginstal OSL.
Spesifikasi bahasa OSL dapat ditemukan di src/doc/osl-lingualspec.pdf (dalam distribusi sumber) atau di file share/doc/OSL/osl-lingualspec.pdf dari distribusi biner yang diinstal.
Dokumentasi OSL Eksperimental pada ReadTheDocs Ini akan menjadi dokumentasi masa depan. Ini mungkin selengkap PDF, namun perlu beberapa koreksi, sehingga PDF masih dianggap sebagai sumber resmi untuk saat ini. Namun dalam waktu dekat, spesifikasi PDF lama tidak akan digunakan lagi dan digantikan dengan dokumentasi online ini.
Ada juga versi PDF.
Bagi mereka yang tertarik untuk belajar memprogram shader di OSL, ada kursus OSL Shaders for RenderMan Forum Pendidik Siggraph 2022, yang menggunakan RenderMan dalam contoh dan Materi Tambahan, tetapi utamanya tentang penulisan shader di OSL.
Pertanyaan sederhana "bagaimana caranya...", "Saya mengalami masalah", atau "apakah ini bug" paling baik ditanyakan di milis pengembang osl-dev. Di situlah sebagian besar orang akan melihatnya dan berpotensi dapat menjawab pertanyaan Anda dengan cepat (lebih dari sekedar "masalah" GH).
Bug, masalah build, dan kerentanan yang ditemukan yang Anda yakini secara relatif merupakan masalah yang sah dalam kode, dan untuk itu Anda dapat memberikan instruksi yang jelas tentang cara mereproduksinya, harus dilaporkan sebagai masalah.
Jika Anda merasa menemukan potensi kerentanan di OSL, harap laporkan secara rahasia dengan mengirim email ke administrator proyek di [email protected].
Jika ada masalah lain yang memerlukan kerahasiaan sehingga tidak dapat diajukan pertanyaan atau masalah publik, Anda dapat menghubungi administrator proyek secara pribadi di [email protected].
OSL menyambut baik kontribusi kode, dan hampir 50 orang telah melakukannya selama bertahun-tahun. Kami mengambil kontribusi kode melalui mekanisme permintaan tarik (PR) GitHub yang biasa. Silakan lihat KONTRIBUSI untuk petunjuk rinci.
halaman OSL GitHub
Baca atau berlangganan milis pengembangan OSL
PDF terbaru dari spesifikasi bahasa OSL
halaman utama OSL
Kepemimpinan proyek saat ini didokumentasikan dalam arsip Tata Kelola.
Banyak orang telah menyumbangkan fitur, perbaikan bug, dan perubahan lain pada OSL selama bertahun-tahun: Steve Agland, Shane Ambler, Martijn Berger, Farchad Bidgolirad, Nicholas Bishop, Curtis Black, Rasmus Bonnedal, Solomon Boulos, Stefan Bruens, Stefan Büttner, Matthaus G . Chajdas, Clark Chen, Mehdi Chinoune, Alejandro Conty, Damien Courtois, Dieter De Baets, Thomas Dinges, Daniel Dresser, Mads Drøschler, Peter Ellerington, Luke Emrose, Louis Feng, Mark Final, Henri Fousse, Stephen Friedman, Syoyo Fujita, Tim Grant, Larry Gritz, Nicolas Guiard, Euan Haahr, Derek Haase, Sven-Hendrik Haase, John Haddon, Niklas Harrysson, Daniel Heckenberg, Chris Hellmuth, Adrien Herubel, Dan Horák, Thiago Ize, Matt Johnson, Ronan Keryell, Chris Kulla, Elvic Liang, Max Liani, Adam Martinez, John Mertic, Bastien Montagne, Steena Monteiro, Patrick Mours, Alexis Oblet, Erich Ocean, Mikko Ohtamaa, Jino Park, Alexei Pawlow, Mitch Prater, Jay Reynolds, Declan Russell, Benoit Ruiz, Patrick Scheibe, Alex Schworer, Jonathan Scruggs, Sergey Sharybin, Mark Sisson, Sandip Shukla, Cliff Stein, Stephan Steinbach, Luya Tshimbalanga, Esteban Tovagliari, Brecht Van Lommel, Thibault Vergne, Alexander von Knorring, Aidan Welch, Alex Wells, Roman Zulak. (Dicantumkan berdasarkan abjad; jika kami melewatkan siapa pun, hal itu tidak disengaja, harap beri tahu kami.)
Kami sangat berterima kasih kepada para manajer di Sony Pictures Imageworks yang mengizinkan proyek ini berjalan, mendukungnya dengan sepenuh hati, dan mengizinkan kami merilis sumbernya, terutama Rob Bredow, Brian Keeney, Barbara Ford, Rene Limberger, Erik Strauss, dan Mike Mengarungi.
Terima kasih yang sebesar-besarnya juga kami sampaikan kepada tim crack shading di SPI, dan para TD dan CG super yang terlihat berani dan bersedia menggunakan OSL di acara mereka. Mereka berperan sebagai kelinci percobaan, inspirasi, penguji, dan sumber masukan yang luar biasa. Dan tentu saja, banyak insinyur, TD, dan seniman di tempat lain yang memasukkan OSL ke dalam produk dan saluran mereka, terutama para pengambil risiko awal di Chaos Group, Double Negative, Pixar, DNA, Isotropix, dan Animal Logic. Terima kasih, dan kami berharap kami telah tanggap terhadap kebutuhan Anda.
OSL tidak dikembangkan secara terpisah. Kami berhutang budi kepada individu dan studio yang dengan sabar membaca draf awal spesifikasi bahasa dan memberi kami masukan yang sangat berguna dan ide tambahan, serta kontribusi dan masukan berkelanjutan dari pengembang dan pengguna saat ini di VFX dan studio animasi lainnya.
Implementasi OSL bergantung pada beberapa paket sumber terbuka lainnya, semuanya dengan lisensi yang kompatibel:
Dokumentasi OSL menggabungkan bagian dari Markdeep (c) 2015-2016, Morgan McGuire, dan highlight.js (c) 2006, Ivan Sagalaev, keduanya didistribusikan di bawah lisensi BSD.