歡迎使用開放著色語言!
開放著色語言 (OSL) 是一種小型但功能豐富的語言,用於高級渲染器和其他應用程式中的可程式著色,非常適合描述材質、燈光、位移和圖案生成。
OSL 最初由 Sony Pictures Imageworks 開發,用於其用於長片動畫和視覺效果的內部渲染器,並作為開源發布,以便其他視覺效果和動畫工作室以及渲染軟體供應商使用。現在,它已成為視覺特效和動畫功能事實上的標準著色語言,在整個行業的許多商業和工作室專有渲染器中使用。因此,OSL 的工作於 2017 年獲得了奧斯卡技術成就獎。
OSL 功能強大且經過製作驗證,已在《超凡蜘蛛人》、《精靈旅社》、《明日邊緣》、《蟻人》、《海底總動員:多莉》等多部電影中使用。用於高階視覺特效和動畫工作的大多數領先渲染器都支援 OSL。有關電影和產品的完整列表,請參閱電影目錄。
OSL 代碼根據「New/3-clause BSD」許可證分發,文件根據 Creative Commons Attribution 4.0 International License 分發。簡而言之,您可以在自己的應用程式中自由使用OSL,無論它們是免費的還是商業的、開放的還是專有的,也可以根據需要修改OSL 程式碼和文檔,前提是您保留原始版權聲明,如許可證。
OSL 的語法類似於 C 以及其他著色語言。然而,它是專門為高級渲染演算法而設計的,並具有諸如輻射閉包、BSDF 和延遲光線追蹤等一流概念的功能。
OSL 具有其他著色語言所沒有的幾個獨特特徵(當然不是全部都具備)。您會發現 OSL 與其他語言相比有以下一些不同之處:
表面和體積著色器計算輻射閉合,而不是最終顏色。
OSL 的表面和體積著色器以輻射度為單位計算表面或體積散射光的方式的明確符號描述(稱為「閉包」)。這些輻射閉包可以在特定方向上進行評估,採樣以找到重要方向,或保存以供以後評估和重新評估。這種新方法非常適合支援光線追蹤和全域照明的基於物理的渲染器。
相較之下,其他著色語言通常僅計算從特定方向可見的表面顏色。這些舊的著色器是“黑盒子”,渲染器只能執行這些黑盒子來查找這一資訊(例如,沒有有效的方法從它們中發現哪些方向對於採樣很重要)。此外,燈光和表面的物理單位通常未指定,因此很難確保著色器以物理正確的方式運作。
表面和體積著色器不會循環燈光或發射光線。
OSL 表面著色器中沒有「光環」或明確追蹤的照明光線。相反,表面著色器計算描述表面如何散射光的輻射閉包,渲染器中稱為「積分器」的部分評估特定光源集的閉包,並確定應追蹤光線的方向。通常需要顯式光線追蹤的效果(例如反射和折射)只是輻射閉包的一部分,並且看起來與任何其他 BSDF 一樣。
這種方法的優點包括積分和取樣可以分批或重新排序以增加射線相干性;可以分配「光線預算」來對 BSDF 進行最佳採樣;封閉物可用於雙向光線追蹤或 Metropolis 光傳輸;並且可以使用新的照明快速重新評估閉包,而無需重新運行著色器。
表面著色器和燈光著色器是同一件事。
OSL 沒有單獨的光源著色器。燈光只是發光的表面,所有燈光都是區域光。
透明度只是另一種照明。
您不需要在著色器中明確設定透明度/不透明度變數。透明度只是光與表面互動的另一種方式,並且包含在表面著色器計算的主輻射閉包中。
渲染器輸出(AOV)可以使用“光路表達式”來指定。
有時需要輸出包含單獨照明組件(例如鏡面反射、漫反射、反射、單獨燈光等)的圖像。實現的。
OSL 著色器不需要混雜任何程式碼或輸出變數來實現此目的。相反,有一個基於正規表示式的符號來描述哪些光路應該貢獻哪些輸出。這一切都是在渲染器端完成的(儘管由 OSL 實作支援)。如果您需要新的輸出,則根本不需要修改著色器;你只需要告訴渲染器新的光路表達式。
著色器被組織成網路。
OSL 著色器不是整體式的,而是可以組織成著色器網路(有時稱為著色器群組、圖形或 DAG),其中某些節點的命名輸出連接到網路內其他節點的命名輸入。這些連接可以在渲染時動態完成,並且不會影響各個著色器節點的編譯。此外,只有當從依賴它們的後續節點「拉出」它們的輸出時,才會對各個節點進行惰性評估(著色器編寫者可能仍然幸福地不知道這些細節,並編寫著色器,就好像一切都正常評估一樣)。
沒有網格或額外著色點的任意導數。
在 OSL 中,您可以在著色器中取得任何計算量的導數,並使用任意量作為紋理座標並期望正確的過濾。這不需要將陰影點排列在矩形網格中,或具有任何特定的連接性,或對任何「額外點」進行陰影處理。這是因為導數不是透過與相鄰點的有限差計算的,而是透過「自動微分」計算的,計算導致導數的變數的偏微分,而無需著色器編寫器進行任何干預。
OSL 在渲染時積極優化
OSL 使用LLVM 編譯器框架將著色器網絡即時翻譯為機器碼(即時或“JIT”),並在此過程中大力優化著色器和網絡,充分了解著色器參數和其他運行時值,而這些值是無法實現的。因此,我們發現我們的 OSL 著色網路的執行速度比用 C 手工製作的同等著色器快 25%! (這就是我們的舊著色器在渲染器中的工作方式。)
OSL 開源發行版由以下元件組成:
oslc,一個獨立的編譯器,可將 OSL 原始碼轉換為類似彙編的中間程式碼(以 .oso 檔案的形式)。
liboslc,一個實作 OSLCompiler 類別的函式庫,其中包含著色器編譯器的內部結構,以防有人需要將其嵌入到其他應用程式中並且不希望編譯器成為單獨的執行檔。
liboslquery,一個實作 OSLQuery 類別的函式庫,它允許應用程式查詢有關已編譯著色器的信息,包括其參數、類型以及與其關聯的任何元資料的完整列表。
oslinfo,一個命令列程序,它使用 liboslquery 將有關著色器及其參數的所有相關資訊列印到控制台。
liboslexec,一個實作 ShadingSystem 類別的函式庫,它允許在應用程式中執行編譯的著色器。目前,它使用 LLVM 將著色器字節碼 JIT 編譯為 x86 指令。
testshade 是一個程序,可讓您在點的矩形陣列上執行著色器(或連接的著色器網路),並將其任何輸出儲存為映像。這允許驗證著色器(和著色系統),而無需整合到功能齊全的渲染器中,並且是我們大多數測試套件驗證的基礎。與 testrender 一起,testshade 是如何呼叫 OSL 函式庫的一個很好的範例。
testrender,一個使用 OSL 著色的小型光線追蹤渲染器。功能非常少(此時只允許球體)並且沒有關注性能,但它演示瞭如何將 OSL 庫集成到工作渲染器中、渲染器需要提供哪些接口以及 BSDF/應評估和整合輻射閉包(包括多重重要性採樣)。
一些範例著色器。
文件-目前由 OSL 語言規範(對著色器編寫者有用)組成,但將來將包含有關如何將 OSL 庫整合到渲染器中的詳細文件。
此清單僅包含已說明或可從公共來源推斷出 OSL 使用的電影或產品,或我們被告知可以在此處列出的電影或產品。如果缺少使用 OSL 的項目且該項目不是秘密,只需向 OSL 專案負責人發送電子郵件或提交對此文件進行編輯的 PR 即可。
(按照新增 OSL 支援的大致順序)
(在這裡,我們認為「重要作品」是指在院線或主要串流平台上發行的長片、以視覺效果或動畫為特色的電視/串流媒體連續劇,或已贏得或被提名主要獎項的短片。 )
請閱讀 INSTALL.md 檔案以取得有關如何建置和安裝 OSL 的詳細說明。
OSL 語言規格可以在 src/doc/osl-languagespec.pdf(在來源發行版中)或已安裝的二進位發行版的 share/doc/OSL/osl-languagespec.pdf 檔案中找到。
ReadTheDocs 上的實驗性 OSL 文件 這將是未來的文檔。它可能與 PDF 一樣完整,但需要一些校對,因此 PDF 目前仍被視為權威來源。但很快,舊的 PDF 規範將被棄用,取而代之的是此線上文件。
還有一個 PDF 版本。
對於有興趣學習在 OSL 中編寫著色器的人,可以閱讀 Siggraph 2022 教育者論壇 OSL Shaders for RenderMan 課程,該課程在範例和補充資料中使用 RenderMan,但主要是關於在 OSL 中編寫著色器。
簡單的「我該如何...」、「我遇到麻煩」或「這是一個錯誤」問題最好在 osl-dev 開發人員郵件列表上提出。這是大多數人會看到它的地方,並且可能能夠快速回答您的問題(比 GH“問題”更重要)。
Bug、建置問題和發現的漏洞,您相對確定是程式碼中的合法問題,並且您可以給出有關如何重現的明確說明,應將其報告為問題。
如果您認為您發現了 OSL 中的潛在漏洞,請透過發送電子郵件至 [email protected] 來秘密報告該漏洞。
如果任何其他問題需要保密而無法公開提問或問題,您可以透過 [email protected] 私下聯繫專案管理員。
OSL 歡迎程式碼貢獻,多年來已有近 50 人這樣做。我們透過常用的 GitHub 拉取請求 (PR) 機制來取得程式碼貢獻。請參閱貢獻以取得詳細說明。
OSL GitHub 頁面
閱讀或訂閱 OSL 開發郵件列表
OSL 語言規範的最新 PDF
OSL 首頁
目前的專案領導記錄在治理文件中。
多年來,許多人為 OSL 貢獻了功能、錯誤修復和其他更改: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。拉里·格里茨、尼古拉斯·吉亞德、尤安·哈爾、德里克·哈斯、斯文-亨德里克·哈斯、約翰·哈登、尼克拉斯·哈里森、丹尼爾·赫肯伯格、克里斯·赫爾姆斯、阿德里安·赫魯貝爾、丹·霍拉克、蒂亞戈·伊澤、馬特·約翰遜、羅南·克里爾、克里斯·庫拉、埃爾維克梁, 馬克斯·利亞尼, 亞當·馬丁內斯, 約翰·默蒂克, 巴斯蒂安·蒙塔尼, 斯蒂娜·蒙泰羅, 帕特里克·莫爾斯, 亞歷克西斯·奧布萊特, 埃里希·奧申, 米克·奧塔瑪, 基諾·帕克, 阿列克謝·波洛, 米奇·普拉特, 傑伊·雷諾茲, 德克蘭·拉塞爾, 伯努瓦·魯伊斯, 帕特里克·沙貝,亞歷克斯·施沃勒、喬納森·斯克魯格斯、謝爾蓋·沙裡賓、馬克·西森、桑迪普·舒克拉、克里夫·斯坦、史蒂芬·斯坦巴赫、盧雅·欽巴蘭加、埃斯特萬·托瓦利亞裡、布萊希特·範·洛梅爾、蒂博·韋爾涅、亞歷山大·馮·克諾林、艾丹·韋爾奇、亞歷克斯·威爾斯、羅曼·祖拉克。 (按字母順序列出;如果我們遺漏了任何人,那是無意的,請告訴我們。)
我們無法對索尼影業Imageworks 的經理表達足夠的謝意,他們讓這個項目得以繼續進行,全心全意地支持它,並允許我們發布源代碼,特別是Rob Bredow、Brian Keeney、Barbara Ford、Rene Limberger、Erik Strauss 和Mike福特。
也要非常感謝 SPI 的裂紋著色團隊,以及願意在他們的節目中使用 OSL 的勇敢的外觀開發 TD 和 CG 主管。他們充當我們的實驗對象、靈感、測試者和回饋的絕佳來源。當然,還有許多其他地方的工程師、技術總監和藝術家將 OSL 融入他們的產品和流程中,尤其是 Chaos Group、Double Negative、Pixar、DNA、Isotropix 和 Animal Logic 的早期冒險家。謝謝您,我們希望我們能夠滿足您的需求。
OSL 並不是孤立開發的。我們感謝那些耐心閱讀語言規範的早期草稿並為我們提供非常有用的反饋和其他想法的個人和工作室,以及其他 VFX 和動畫工作室的當前開發人員和用戶的持續貢獻和反饋。
OSL 實作依賴其他幾個開源套件,所有這些都具有相容的授權:
OSL 的文檔包含 Markdeep (c) 2015-2016、Morgan McGuire 和highlight.js (c) 2006、Ivan Sagalaev 的部分內容,兩者均在 BSD 許可證下分發。