Chapter01

1. **イントロダクション**
2. 概要
3. 字句構造
4. 全体的な構文...
5. データ型
6. 言語構文
7. 標準ライブラリ関数
8. 形式言語文法
9. シェーダグループの記述
10. 用語集
11. Light Path Ex...

## 1. イントロダクション

Open Shading Languageにようこそ!

Open Shading Language (OSL)とは、高度なレンダラーや他のアプリケーションに対してプログラム可能なシェーディングをするための軽量で豊富な言語であり、マテリアル、ライト、ディスプレイスメント、パターン生成を記述するのに適しています。

OSLは、長編映画アニメーションやVFXで使われているインハウスのレンダラーでの使用を目的にSony Pictures Imageworks社で開発されました。この言語の仕様は、それを使いたい他のVFXスタジオやアニメーションスタジオの人達の要望も反映して開発されました。
OSLは、“新しいBSD”ライセンスの基で配布されています。要するに、あなた独自のアプリケーションで使用するのは無料/商用、オープン/プロエタリにかかわらず自由です。さらに、そのライセンスに記述されているように、元の著作権の表記をしていれば、望みどおりにOSLコードを修正しても構いません。

### OSLと他のシェーディング言語との違い

OSLの構文は他のシェーディング言語と同様にC言語に似ています。
とはいえ、特にOSLは高度なレンダリングアルゴリズム向けに設計されており、例えばラディアンスクロージャ、BSDF、そして最上級の概念としてディファードレイトレースなどの機能が備わっています。

OSLには、他のシェーディング言語にはない(どれもまったく違うということはないですが)固有の特徴がいくつかあります。ここでは、他の言語と異なるOSLの事について説明しています:

### サーフェス/ボリュームシェーダは、最終カラーではなく、ラディアンスクロージャを計算します。

OSLのサーフェス/ボリュームシェーダは、**closure(クロージャ)**と呼ばれる明快な象徴的表現を計算します。その方法によって、サーフェスまたはボリュームがラディアンス単位で光を散乱させます。
これらのラディアンスクロージャは、特定の方向で評価したり、サンプリングして重要な方向を検索したり、後で評価/再評価するために保存したりすることができます。
この新しい手法は、レイトレースやグローバルイルミネーションに対応した物理ベースのレンダラーに適しています。

それとは対照的に、他のシェーディング言語は通常では特定の方向から見えるサーフェスカラーだけを計算します。
このような古いシェーダは**ブラックボックス**なので、レンダラーがこの一回の情報に対して実行すること以外にできることは限られています(例えば、実際にその情報からサンプリングに重要な方向を検索する方法がありません)。
しかも、ライトとサーフェスの物理単位が指定されていないことがほとんどなので、シェーダを物理的に正しく動作させることが非常に難しいです。

### サーフェス/ボリュームシェーダは、ライトまたは放射光線ごとにループしません。

OSLサーフェスシェーダには、**ライトループ**や明示的にトレースさせる光線がありません。
その代わりに、サーフェスシェーダでは、サーフェスが光を散乱させる方法を記述したラディアンスクロージャを計算します。
そして、**インテグレータ**と呼ばれるレンダラーの一部が、特定の光源セットに対してクロージャを評価し、トレースさせる光線の方向を決定します。
通常では明示的なレイトレースを必要とする反射や屈折といった効果は、単なるラディアンスクロージャの一部であり、他のBSDFと同様に見えます。

この手法の利点は、そのようなインテグレーションが含まれていて、サンプリングを一括処理または並べ直すことで、光線のコヒーレンス(可干渉性)を上げることができます。
つまり、BSDFを最適にサンプリングできるように**Ray Budget(光線の割当量)**を割り当てることができます。クロージャは、双方向レイトレーシングまたはMetropolisライトトランスポートに使用することができます。
このクロージャは、シェーダを再実行させることなく新しいライティングを使って即座に再評価することができます。

### サーフェス/ライトシェーダは同じものです。

OSLでは、光源用のシェーダの区別がありません。ライトとは発光する単なるサーフェスに過ぎず、すべてのライトはエリアライトです。

### 透明度とは、別の種類の照明に過ぎません

シェーダ内でTransparency(透明度)/Opactity(不透明度)の変数を明示的に設定する必要はありません。Transparency(透明度)は、ライトをサーフェスに作用させるための別の方法に過ぎず、サーフェスシェーダによって計算される主なラディアンスクロージャに含まれています。

### ライトパスエクスプレッションを使ってレンダラーの出力(AOV)を指定します

スペキュラー、ディフューズ、反射、個々のライトなどの各ライティングコンポーネントを含んだ画像を出力したいことがあります。
他の言語なら通常では、大量に"出力変数"をシェーダに追加して、それらのコンポーネントの量を収集させることで、これを実現させています。
OSLシェーダでは、何かコードや出力変数を追加してコードを汚すことなく、これを実現することができます。
代わりに、どのライトパスがどの出力に寄与させるのかを記述するための正規表現ベースの表記があります。
この表記は、(OSLの実装に対応している)レンダラー側ですべて処理されます。新しい出力が必要になっても、シェーダをまったく修正する必要がありません。
つまり、レンダラーにその新しいライトパスエクスプレッションを伝えるだけで良いです。

### シェーダをネットワークで構成する

OSLシェーダはモノリシックではないので、いくつかのノードの名前の付いた出力をネットワーク内の別のノードの名前の入力に接続することで、シェーダネットワーク(場合によってはシェーダグループ、グラフ、DAGと呼びます)を構成することができます。これらの接続はレンダリング時に動的に接続させることができ、個々のシェーダノードのコンパイルに影響しません。さらに、個々のノードは緩く評価され、それらの出力のみが、それらに依存した下流のノードに**渡され**ます(シェーダ作成者は、それらのノードの詳細を何も意識しないまま、すべてが通常通りに評価されているものとしてシェーダを書くことができます)。

### OSL言語には"uniform"または"varying"のキーワードがありません。

OSLシェーダはSIMD(単一命令複数データ)形式で評価され、一度に多くのポイントに対してシェーダを実行しますが、シェーダ作成者にとってはどの変数がuniformまたはvaryingなのかを宣言する必要がありません。

オープンソースのOSL実装では、この宣言は自動的に動的に処理されます。つまり、命令毎に変数に割り当てられている内容に応じて、変数をuniformとvaring間で切り替えます。

### グリッドや余計なシェーディングポイントを使わない任意の微分係数。

OSLでは、計算された量の微分係数をシェーダ内で取得することができるので、その任意の量をテクスチャ座標として使用することで正しいフィルタリングを求めることができます。
これには、シェーディングポイントが矩形グリッド内に配置されている必要がなく、特定の接続性になっている必要もなく、**余計なポイント**がシェーディングされている必要もありません。

オープンソースのOSL実装では、隣接ポイントを使った有限差分法ではなく、**自動微分**によって微分方程式が計算されており、シェーダ作成者が何も気にすることなく、その変数の偏微分を計算して微分係数を導き出しているので、これが可能です。

謝辞
--

OSLの初期の設計者とプロジェクトリーダーは、Larry Gritzです。
その他のOSLの初期開発者は、(このプロジェクトの参加順に): Cliff Stein, Chris Kulla, Alejandro Conty, Jay Reynolds, Solomon Boulos, Adam Martinez, Brecht Van Lommelです。

さらに他の多くの方々が、機能開発、バグフィックス、その他変更に貢献してきました: Steve Agland, Shane Ambler, Martijn Berger, Farchad Bidgolirad, Nicholas Bishop, Stefan Bttner, Matthaus G. Chajdas, Thomas Dinges, Henri Fousse, Syoyo Fujita, Derek Haase, Sven-Hendrik Haase, John Haddon, Daniel Heckenberg, Ronan Keryell, Elvic Liang, Max Liani, Bastien Montagne, Erich Ocean, Mikko Ohtamaa, Alex Schworer, Sergey Sharybin, Stephan Steinbach, Esteban Tovagliari, Alexander von Knorring, Roman Zulak(アルファベット順。他にもいましたら、私たちに知らせてください)。

このプロジェクトの進行を許可し、心から支援していただき、このソースの公開を許可していただいたSony Pictures Imageworksのマネージャ、特にRob Bredow, Brian Keeney, Barbara Ford, Rene Limberger, Erik Straussには、十分に感謝の意を表わすことができません。

SPIのクラックシェーディングチームとOSLをショーで使用することを決めた勇敢なルックデブのTDとCGスーパーバイザーにも大変感謝します。
彼らは、私たちに実験台、名案、テスター、そして素晴らしいフィードバックのソースを提供していただきました。ありがとう。私たちは、あなたの要求に応えれたことを願っています。

OSLは孤独に開発されませんでした。私たちは、言語仕様の初期の草案をしっかりと読んで、非常に助かるフィードバックと更なるアイデアをくださった個人またはスタジオのみなさん、そして特にOSLを自社プロダクやパイプラインに組み込む挑戦をしていただいた他の会社の方々に感謝しています。

オープンソースのOSL実装は、いくつかの他のオープンソースパッケージを組み込み、またはそれに依存しています:

* OpenImageIO © 2008 Larry Gritz et al. http://openimageio.org
* Ilmbase © 2006, Industrial Light & Magic. http://www.openexr.com
* Boost © various authors. http://www.boost.org
* LLVM © 2003-2010 University of Illinois at Urbana-Champaign. http://llvm.org

これらの他のパッケージすべてが、それらの使用を許可するライセンスの下で、Open Shading Languageと一緒に配布されています。