Blog?この広告は、90日以上更新していないブログに表示しています。2018-11-28OSLの次の一歩のためのメモ早いものでアドベントカレンダーも間近の季節になりました。大昔BlenderでOSLを使ってみる一歩一歩なんてエントリーを書いたこともあったので、ちょっとOSLについてメモのようなものをまとめておこうと思いました。ちなみにBlenderのバージョンはこれを書いた時点での安定版である2.79bを基にしています。情報源まずは個人的によく参照する情報源です。Language言わずと知れたBlender公式マニュアルのOSLの項目です。関数まで説明されています。GitHubOSLの公式リポジトリです。最新のSpecificationがあります。言語自体の仕様は全てここに書かれています。ありがたいことにKaz-Kitaguchi氏によるSpecificationの非公式日本語訳というものもあります。参考にさせていただきましょう。CyclesのOSL関連の実装部分のソースblender_source/intern/cycles/kernel/osl/いうまでもなくBlenderおよびCyclesはオープンソースなので実装部分のソースを見ることができます。versions』などと書かれたプルダウンからソースのアーカイブを落とすことができます。このアーカイブを展開したものをblender_sourceとして、CyclesでのOSLの実装部分のソースが上記のパスになります。重要なのはosl_service.cppです。ここに大抵のOSLの関数に対応するCyclesの実装が書いてあります。ファイルの上の方にアトリビュートが定数で並んでいますが、ファイル内を検索してみると実は非対応などというものもあったりします。マテリアルノードのOSL実装blender_source/intern/cycles/kernel/shadersこの中にはCyclesのノードを全てOSLで実装したものがあります。OSLモードで使われているものでしょう。したテクニックから、Blender固有の事情になるUVや頂点カラーが複数ある場合の取得方まで意外と参考になったりします。OSLを生かしたものという感じで面白いです。Tips小ネタをいくつか。variablesで説明されている大域変数の表です。何が定義されてるんだっけとよく参照するので書き出してみます。入射輝度これらについては使ったことがなくて本当に入ってくるかは知らないものもあります。NodeのページにOSLで取得できるアトリビュートの一覧があると上に書きました。どんな型の変数で受け取れば良いのかが書かれていません。想像はつくと思いますが、せっかくなので上記のマテリアルノードのOSL実装の中から探して並べてみました。colorobject:indexとmaterial:indexがfloatだったりと注意したいところがいくつかありそうです。ちなみに探してみるとここに上がっていないものも取得する方法が見つかったりします。attributeに合った型の変数)という強力な機能があります。制限があり、仕様では存在するtraceの"shade"と"traceset"の2つのオプションは無効になっています。それに伴ってレイのヒット先からは取得できないアトリビュートがいくつかあります。ドキュメントに書いてあるようにライティングに使うのではなく、周囲の調査に使ってアンビエントオクルージョンのように使えるかもね、というものです。いえアイデア次第です。関数の引数は参照扱い最後にちょっとした仕様のことを。OSLはC言語風ですが関数に渡される引数は全て参照扱いです、と書いてあります。わかる人にはこの解説で十分ですが、超訳して言うと、引数を再利用する形で処理を書くと呼び出し元の値も変更されますということです。