Doc:JA/2.6/Manual/Render/Cycles/Nodes/OSL

提供: wiki
< Doc:JA‎ | 2.6‎ | Manual‎ | Render‎ | Cycles‎ | Nodes
移動先: 案内検索

オープン・シェーディング言語(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.66  
  • translucent(N)
  • transparent()
  • ashikhmin_velvet(N, roughness)
  • ward(N, T, roughness_u, roughness_v)
  • diffuse_toon(N, size, smooth)   New in version 2.66  
  • specular_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 といった値に置き換えて参照して下さい。