Doc:JA/2.6/Manual/Render/Cycles/Nodes/OSL
目次
オープン・シェーディング言語(OSL)
Blender の利用者は Open Shading Language (オープン・シェーディング言語、以下OSL)を利用して任意のノードを作成できます。ただしそれらのノードは OSL のコードが GPU 上で動作しないため、CPU のレンダリング時においてのみ利用可能です。この機能を利用するには、レンダリング設定上でシェーディングシステムとして OSL を選択してください。
スクリプト・ノード
OSL はノード・ベースのシェーディングを利用するために設計され、ノードの設計において各 OSL シェーダが1つのノードに対応します。OSL シェーダを追加するには、1つのスクリプト・ノードを追加し、それをテキスト・データブロックあるいは外部ファイルにリンクさせます。入出力ソケットは、そのシェーダのパラメータからノード内もしくはテキスト・エディタの update ボタンをクリックすることで作成されます。
OSL シェーダはノードに対していくつかの異なった方法でリンク出来ます。Internal モードでは、1つのテキスト・データブロックがその OSL シェーダを格納するために利用され、その OSO バイトコードはノード自体の中に保存されます。これは全ての要素を内蔵した .blend ファイルを配布する際に有用です。
External モードではディスク上の1つの .osl ファイルを指定して利用し、同じディレクトリ内に自動的に .oso ファイルがコンパイルされて保存されます。このモードでは任意の .oso ファイルを指定して、利用者が設定することで直接利用することもできます。3番目の方法としてシェーダの検索パスに有るモジュールの名前を指定するだけでも利用できます。
シェーダの検索パスはスクリプトが保存された場所と同じ場所、もしくは下表に設定されたパス内です。注
Linux | /home/$user/.config/blender/Version Number/shaders/
|
Windows | C:\Users\$user\AppData\Roaming\Blender Foundation\Blender\Version Number\shaders\
|
Mac OS X | /Users/$user/Library/Application Support/Blender/Version Number/shaders/
|
大規模な開発においては、シェーダのスクリプト・ノードをラップしたノード・グループを用意し、そのグループを他の .blend ファイルに関連付ける事を推奨します。この方法では、ソケットの追加・削除を行なってもそのスクリプト・ノードを持つ全てのファイルを更新する必要がなくなり、ノードの編集を容易にします。
シェーダの記述
シェーダの記述法についての詳細は OSL specification を参照してください。ここには簡単な例を示します。
shader simple_material( color Diffuse_Color = color(0.6, 0.8, 0.6), float Noise_Factor = 0.5, output closure color BSDF = diffuse(N)) { color material_color = Diffuse_Color * mix(1.0, noise(P * 10.0), Noise_Factor); BSDF = material_color * diffuse(N); }
クロージャ ( Closures )
OSL は RSL あるいは GLSL 等と異なり、光源ループを持っていません。シーン中の光源にアクセスする手段が存在せず、そのマテリアルはそのレンダリング・エンジン自体に内蔵されたクロージャから生成されます。この方法は従来の方法よりも制限が有りますが、一方でレンダリング・エンジンによる最適化と、全てのシェーダのインポータンス・サンプリングを可能にします。
Cycles において利用可能なクロージャはシェーダ・ノードおよびそれらのソケットに対応します。クロージャがどのように動作するか、パラメータの意味についての詳細は shader nodes manual を参照してください。
BSDF
diffuse(N)
oren_nayar(N, roughness)
reflection(N)
refraction(N, ior)
microfacet_beckmann(N, roughness)
microfacet_beckmann_refraction(N, roughness, ior)
microfacet_ggx(N, roughness)
microfacet_ggx_refraction(N, roughness, ior)
phong_ramp(N, exponent, colors[8])
diffuse_ramp(N, colors[8])
New in version 2.66translucent(N)
transparent()
ashikhmin_velvet(N, roughness)
ward(N, T, roughness_u, roughness_v)
diffuse_toon(N, size, smooth)
New in version 2.66specular_toon(N, size, smooth)
New in version 2.66
Other
emission()
holdout()
background()
Attributes
いくつかのオブジェクト、パーティクルそしてメッシュの属性値は getattribute() 関数を利用することで参照できます。UV マップと頂点カラーはその名称で参照できます。その他の属性値については下記のとおりです。
geom:generated
|
生成されたテクスチャ座標 |
geom:uv
|
デフォルトでレンダリングされる UV マップ |
geom:dupli_generated
|
複製元のオブジェクトから生成された座標 |
geom:dupli_uv
|
複製元のオブジェクトの UV 座標 |
geom:trianglevertices
|
三角形をなす3頂点が形成する座標系 |
geom:numpolyvertices
|
指定された面を形成する頂点数(現在は常に3を返します) |
geom:polyvertices
|
Vertex coordinates array of the polygon (always 3 vertices currently) |
geom:name
|
オブジェクトの名称 |
geom:is_curve
|
オブジェクトが囲み線( strand )であるかどうか |
geom:curve_intercept
|
Point along the strand, from root to tip |
geom:curve_thickness
|
囲い線の線幅 |
geom:curve_tangent_normal
|
囲い線の接線に対する法線 |
path:ray_length
|
Ray distance since last hit |
object:location
|
オブジェクトの位置 |
object:index
|
オブジェクトのインデックス値 |
object:random
|
Per object random number generated from object index and name |
material:index
|
マテリアルのインデックス値 |
particle:index
|
パーティクルのインスタンス値 |
particle:age
|
フレームを基準にしたパーティクル生成からの経過時間 |
particle:lifetime
|
パーティクルが出力されている総時間 |
particle:location
|
パーティクルの位置 |
particle:size
|
パーティクルの大きさ |
particle:velocity
|
パーティクルの速度 |
particle:angular_velocity
|
パーティクルの角速度 |
トレース
OSL シェーダから生成される光線をトレースする事を目的とした trace(point pos, vector dir, ...) 関数が利用可能です。現在のところ "shade" パラメータはサポートされていませんが、 getmessage("trace", ..) 関数で参照できるオブジェクトからは属性値を参照することができます。この関数の詳細な利用法については OSL の仕様書を参照ください。
この機能は、シェーダが周囲の幾何的な条件を検知する事が本来の使用目的であるため、ライティングの代わりとして使用することはできません。例えば投射されたテクスチャは、幾何構造の上から"被せられた"場合や、別の環境自然光効果が利用されている場合は、表示されない場合が有ります。
注釈
Version Number をインストールされた環境に応じて、2.65 あるいは 2.66 といった値に置き換えて参照して下さい。