オープン シェーディング言語へようこそ!
Open Shading Language (OSL) は、高度なレンダラーやその他のアプリケーションでプログラマブル シェーディングを行うための小さいながらも豊富な言語であり、マテリアル、ライト、ディスプレイスメント、パターン生成の記述に最適です。
OSL は元々、長編映画アニメーションや視覚効果に使用される社内レンダラーで使用するために Sony Pictures Imageworks によって開発され、他の視覚効果やアニメーション スタジオやレンダリング ソフトウェア ベンダーでも使用できるようにオープン ソースとしてリリースされました。現在、これは VFX およびアニメーション機能の事実上の標準シェーディング言語であり、業界全体で多くの商用およびスタジオ独自のレンダラーで使用されています。このため、OSL の取り組みは 2017 年にアカデミー技術功績賞を受賞しました。
OSL は堅牢で制作実績があり、「アメイジング スパイダーマン」、「ホテル トランシルバニア」、「エッジ オブ トゥモロー」、「アントマン」、「ファインディング ドリー」など、さまざまな映画で使用されています。 OSL は、ハイエンドの VFX およびアニメーション作業に使用されるほとんどの主要なレンダラーでサポートされています。映画と製品の完全なリストについては、フィルモグラフィーをご覧ください。
OSL コードは「新/3 条項 BSD」ライセンスに基づいて配布され、ドキュメントはクリエイティブ コモンズ表示 4.0 国際ライセンスに基づいて配布されます。つまり、無料か商用か、オープンかプロプライエタリかに関係なく、独自のアプリケーションで OSL を自由に使用でき、また、次の説明に従って元の著作権表示を保持している限り、OSL コードとドキュメントを必要に応じて変更することができます。ライセンス。
OSL には、C や他のシェーディング言語と同様の構文があります。ただし、高度なレンダリング アルゴリズム向けに特別に設計されており、最上級のコンセプトとしてラディアンス クロージャ、BSDF、遅延レイ トレーシングなどの機能を備えています。
OSL には、他のシェーディング言語には見られないいくつかのユニークな特徴があります (もちろんすべてが揃っているわけではありません)。 OSL では他の言語と比べて異なる点がいくつかあります。
サーフェイス シェーダーとボリューム シェーダーは、最終的な色ではなく、放射クロージャを計算します。
OSL のサーフェス シェーダとボリューム シェーダは、サーフェスまたはボリュームが光を散乱する方法の「クロージャ」と呼ばれる明示的な記号的記述を放射輝度の単位で計算します。これらの放射輝度クロージャは、特定の方向で評価したり、重要な方向を見つけるためにサンプリングしたり、後の評価や再評価のために保存したりできます。この新しいアプローチは、レイ トレーシングとグローバル イルミネーションをサポートする物理ベースのレンダラーに最適です。
対照的に、他のシェーディング言語は通常、特定の方向から見える表面の色だけを計算します。これらの古いシェーダは「ブラック ボックス」であり、レンダラーはこの 1 つの情報を見つけるために実行することしかできません (たとえば、どの方向がサンプリングに重要であるかをシェーダから発見する効果的な方法はありません)。さらに、ライトとサーフェスの物理単位は過小仕様であることが多く、シェーダーが物理的に正しい方法で動作していることを確認することが非常に困難になります。
サーフェス シェーダとボリューム シェーダは、ライトをループしたり、レイを発射したりしません。
OSL サーフェス シェーダには、「ライト ループ」や明示的にトレースされた照明光線はありません。代わりに、サーフェス シェーダは、サーフェスが光をどのように散乱するかを記述する放射クロージャを計算し、「インテグレータ」と呼ばれるレンダラーの一部が特定の光源セットのクロージャを評価し、光線がどの方向にトレースされるべきかを決定します。反射や屈折など、通常は明示的なレイ トレーシングが必要なエフェクトは、単に放射クロージャの一部であり、他の BSDF と同様に見えます。
このアプローチの利点には、統合とサンプリングをバッチ処理または再順序付けして光線コヒーレンスを向上できることが含まれます。 BSDF を最適にサンプリングするために「レイ バジェット」を割り当てることができます。クロージャは、双方向レイ トレーシングまたはメトロポリス ライト トランスポートに使用できます。また、シェーダを再実行することなく、新しいライティングでクロージャを迅速に再評価できます。
サーフェス シェーダとライト シェーダは同じものです。
OSL には、光源用の別の種類のシェーダがありません。ライトは単に放射するサーフェスであり、すべてのライトはエリア ライトです。
透明性は照明の一種にすぎません。
シェーダーで透明度/不透明度変数を明示的に設定する必要はありません。透明度は、光がサーフェスと相互作用するもう 1 つの方法であり、サーフェス シェーダーによって計算されるメインの放射クロージャに含まれます。
レンダラー出力 (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 を使用してシェーダー バイトコードを x86 命令に JIT コンパイルします。
testshade は、点の長方形配列上でシェーダ (または接続されたシェーダ ネットワーク) を実行し、その出力を画像として保存できるプログラムです。これにより、完全に機能するレンダラーに統合する必要がなく、シェーダー (およびシェーディング システム) の検証が可能になり、ほとんどのテストスイート検証の基礎となります。 testrender と同様に、testshade は、OSL ライブラリを呼び出す方法の良い例です。
testrender は、シェーディングに OSL を使用する小さなレイトレーシング レンダラーです。機能は非常に最小限であり (現時点では球のみが許可されています)、パフォーマンスには注意が払われていませんが、OSL ライブラリが動作するレンダラーにどのように統合されるか、レンダラーが提供する必要があるインターフェイス、および BSDF/放射輝度クロージャを評価して統合する必要があります (複数の重要度のサンプリングを含む)。
いくつかのサンプルシェーダー。
ドキュメント -- 現時点では OSL 言語仕様 (シェーダー ライターに役立つ) で構成されていますが、将来的には OSL ライブラリをレンダラーに統合する方法に関する詳細なドキュメントが作成される予定です。
このリストには、OSL の使用が明記されている、または公的情報源から推測できる、またはここにリストしても問題がないと言われている映画または製品のみが含まれています。 OSL を使用するプロジェクトが見つからず、それが秘密ではない場合は、OSL プロジェクト リーダーに電子メールを送信するか、このファイルを編集して PR を送信してください。
(OSL サポートを追加するおおよその順序)
(ここで「重要な作品」とは、劇場または主要なストリーミング プラットフォームで公開された長編映画、視覚効果やアニメーションを多用した TV/ストリーミング シリーズ、または主要な賞を受賞またはノミネートされた短編映画を意味すると考えています。)
OSL を構築およびインストールする方法の詳細については、INSTALL.md ファイルをお読みください。
OSL 言語仕様は、src/doc/osl- languagespec.pdf (ソース配布内)、またはインストールされているバイナリ配布の share/doc/OSL/osl- languagespec.pdf ファイルにあります。
ReadTheDocs 上の実験的な OSL ドキュメント これは将来のドキュメントになります。おそらく PDF と同じくらい完全ですが、多少の校正が必要なため、現時点では PDF が依然として信頼できる情報源とみなされます。しかし、近い将来、古い PDF 仕様は廃止され、このオンライン ドキュメントが優先される予定です。
PDF版もあります。
OSL でのシェーダのプログラミングの学習に興味がある人向けに、Siggraph 2022 Educator's Forum OSL Shaders for RenderMan コースがあります。このコースでは、例と補足資料で RenderMan が使用されていますが、主に OSL でのシェーダの作成について説明しています。
単純な「どうすればよいですか...」、「問題が発生しています」、「これはバグですか」という質問は、osl-dev 開発者メール リストで尋ねるのが最適です。ここは、ほとんどの人が目にする場所であり、質問にすぐに答えることができる可能性があります (GH の「問題」よりも)。
バグ、ビルドの問題、および発見された脆弱性のうち、コード内の正当な問題であることが比較的確実であり、再現方法について明確な指示を与えることができるものは、問題として報告する必要があります。
OSL に潜在的な脆弱性を発見したと思われる場合は、プロジェクト管理者 (security@openshading language.org) に電子メールを送信して内密に報告してください。
その他の問題で機密保持が必要であり、公開の質問や問題を掲載できない場合は、プロジェクト管理者 ([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チャジダス、クラーク・チェン、メディ・シヌーン、アレハンドロ・コンティ、ダミアン・クルトワ、ディーター・デ・バエ、トーマス・ディンゲス、ダニエル・ドレッサー、マッツ・ドシュラー、ピーター・エラリントン、ルーク・エムローズ、ルイス・フェン、マーク・ファイナル、アンリ・フース、スティーヴン・フリードマン、藤田祥陽、ティムグラント、ラリー・グリッツ、ニコラス・ギアード、ユアン・ハール、デレク・ハース、スヴェン=ヘンドリック・ハース、ジョン・ハドン、ニクラス・ハリソン、ダニエル・ヘッケンバーグ、クリス・ヘルムート、エイドリアン・ヘルベル、ダン・ホラーク、チアゴ・アイゼ、マット・ジョンソン、ローナン・ケリエル、クリス・クラ、エルヴィックリャン、マックス・リアニ、アダム・マルティネス、ジョン・マーティック、バスティアン・モンターニュ、スティーナ・モンテイロ、パトリック・ムアーズ、アレクシス・オブレット、エリック・オーシャン、ミッコ・オータマー、ジノ・パーク、アレクセイ・ポーロウ、ミッチ・プラーター、ジェイ・レイノルズ、デクラン・ラッセル、ブノワ・ルイス、パトリック・シャイベ、アレックス・シュウォラー、ジョナサン・スクラッグス、セルゲイ・シャリビン、マーク・シソン、サンディップ・シュクラ、クリフ・スタイン、シュテファン・シュタインバッハ、ルヤ・チンバランガ、エステバン・トバリアリ、ブレヒト・ファン・ロンメル、ティボー・ベルニュ、アレクサンダー・フォン・クノールリング、エイダン・ウェルチ、アレックス・ウェルズ、ローマン・ズラック。 (アルファベット順にリストされています。誰かが省略されている場合は、それは不注意ですので、お知らせください。)
このプロジェクトの進行を許可し、心からサポートし、ソースの公開を許可してくれたソニー・ピクチャーズ・イメージワークスのマネージャー、特にロブ・ブレドー、ブライアン・キーニー、バーバラ・フォード、レネ・リンバーガー、エリック・ストラウス、マイクには、いくら感謝してもしきれないでしょう。フォード。
SPI のクラック シェーディング チーム、およびショーで OSL を使用することに積極的な勇敢な Lookdev TD と CG Supers にも多大な感謝を送ります。彼らは私たちのモルモット、インスピレーション、テスター、そして素晴らしいフィードバック源として機能しました。そしてもちろん、OSL を製品やパイプラインに組み込んだ他の場所の多くのエンジニア、TD、アーティスト、特に 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 ライセンスの下で配布されています。