ラベル Cycles の投稿を表示しています。 すべての投稿を表示
ラベル Cycles の投稿を表示しています。 すべての投稿を表示

2014年2月9日日曜日

フィギュアの髪のマテリアル

ヘアパーティクルを使わない、こういったマテリアルはテクスチャで髪を丁寧に描いて貼るのが王道らしいのだが、Cyclesだし手抜きしてプロシージャルだけでいいやみたいなノード。Cyclesのマテリアルは内蔵レンダーのように完成形を予想しながら作るというのが難しい。理由のひとつはジオメトリノードやテクスチャ座標ノードが与える影響の度合いがいまいち予想しづらいところにある。

ねんどろ風喜緑さん



髪の毛の上から下に向かってグラデーションを入れようと試していて辿り着いたので、理屈はいまいち理解していない。ただ内蔵レンダーのテクスチャ座標の指定とは若干違うらしいことは分かった。通常はグラデーション+カラーランプを貼るとジオメトリの中心から外に向かって貼られてしまうのでなにも起こってないように見える。マッピングノードで回転や長さを変えると方向がわかるようになる。あらかじめカラーランプの色を赤青などの対照色にして試すとよい。

さらに髪の毛をUV展開しておくとテクスチャが走る方向が分かりやすい。この髪ジオメトリは展開する前に頂点を細かくしすぎてしまったので展開せずそのまま貼っている。

トーンBSDFは照明の位置と強さでハイライトが変わるので、このノードでいじれるのはハイライトの広さと境界線のぼけ具合だけだ。0.1でもかなりなじむ。

ねんどろ風黒子



CyclesでもそのうちベイクできるようになるのでこれをそのままUVマップに焼いておけばかなり短時間でレンダーできるようになると思う。もちろんAOも焼ける。

初心者の頃(というかまだ1年そこそこ前だが)ビットマップとプロシージャルのどっちを使うべきか、その基準が分からずずいぶん迷った。長時間のアニメを作るならまだしも1枚静止画のみで、可能なら内蔵の照明とシェードだけで表現したいと考えていた。よくよく見るとプロシージャルは飽きるしやっぱり情報量が足りない。読者の評価もいまいちである。理想はビットマップを基本にしてプロシージャルを補完的に使うのがエレガントなのではと思う。

Cyclesレンダーによるベイクを試す実験ブランチ



Cyclesレンダーによるベイクを試す実験ブランチ


だいぶ前からCyclesでベイクができたらなーというつぶやきがあったのだが、とうとう実装されたそうだ。以下翻訳

原文:
http://www.blendernation.com/2014/02/08/try-baking-for-cycles-with-this-experimental-branch-now/


2014年1月13日月曜日

Cyclesでボリュームマテリアルテスト その3

ボリュームシェーダーのコードが11日に2.69.8公式ツリーにマージされたようだ。レンダリングがかなり軽くなった。いくつか変更点がある。
  • レンダータブのアルゴリズムの選択がなくなりボリュームサンプリングのステップ値と上限の設定が追加された
  • 等方性ボリュームノードはボリューム拡散(Volume Scatter)とボリューム吸収(Volume Absorption)に別れた。引数gの名称は異方性に修正
  • blenderartistスレの11日のDingto氏の書き込みによるとワールドにおけるサーフェスのライトは見えなくなったかまたは無効になった。サンプル画像にあるようなスポットライトの表現はできなくなったので、もし必要なら大きめの立方体などを使ってボリュームを適用してくれとのこと

散光星雲

レンダー所要時間:3時間40分 1000サンプル

ガス部分のマテリアルノード

最初にイメージしていたものにかなり近づいてきた気がする。きれいに透過したい場合はやはりボリュームノードの密度にアルファ値を食わせるのがいいらしい。しかしこれが前回のようなガワだけでなくボリューム内部まで正しく点描されているかどうかは不明だが、カメラを雲に突っ込むようなアニメーションにするのでないかぎり目的は果たせていると思う。

星雲のうち白い部分は本当は黄色にしたかったのだがなぜか緑が混じってしまい、ボロノイテクスチャの拡大縮小値を下げてしのいだ。白い部分は実はボロノイ模様の円と円の隙間の部分になっている。
上のカラーランプはガス全体を左から右にグラデーションをかけているもので、下のカラーランプで色分けをしている。

右下の千切れている部分は単にオブジェクトに潰れたICO球を追加しただけのもの。これをいくつか点在させればひつじ雲のようなものも作れるかもしれない。しかしながら、本来なら密度係数だけで、たとえば立方体オブジェクトの中にいくつもの雲の形を表現できるのがボリュームの機能なのだが、たぶんそれをやるとメモリを大量に消費するかもしれない。
その2で紹介したWoodcockの論文には、ボリュームを仮想パーティクルのように扱う手法を提唱していたので、オブジェクト内部の任意の座標に置かれた点の集まりをいかに軽量に扱えるかでアルゴリズムの良否がわかれるところだろう。

追記:スレでボリュームの密度にアルファ値を食わせるのは正しい使い方なのかと質問してみたのだが、特に指摘されなかったのでレンダー結果よければすべて良し的な。実際どういう使い方ができるかというのを検証するスレなので問題はないらしい。



2014年1月5日日曜日

トーマス・デンジーズ氏インタビュー記事

トーマス・デンジーズ氏 CyclesのOpen Shading Languageの開発者インタビュー

Dingtoリポジトリのコードを書いている本人のインタビュー記事。

原文:
BlenderDiplom.com Interview: Thomas Dinges on OSL in Cycles

http://blenderdiplom.com/en/interviews/540-interview-thomas-dinges-on-osl-in-cycles.html




2013年12月31日 ゴットフリート・ホフマン氏による執筆

トーマス・デンジーズ氏はBlenderの開発者であり、CyclesへのOpen Shading Language(以下OLS)の実装の推進を支えた一人である。さらにOpenShading.comのWebサイトの最新情報を担当し、関連情報のサポートやチュートリアルなどを紹介している。

このインタビューはFMX 2013( http://www.fmx.de/about/history/fmx-2013.html )で行われ、ドイツ語版のデジタルプロダクション誌で公開されたものである。

BlenderDiplom:トーマスさんはBlender CyclesレンダーエンジンへのOSLの実装に携わった開発者の一人だと伺っていますが、ご自身の経歴について簡単に教えてください。

トーマス:OSLは開発の早い段階からCyclesと関わっていました。2011年頃だったと思います。その頃OSLはすでに実装されていましたがまだ稼動可能状態にはありませんでした。Cyclesのメインの開発者であるブレヒト・ファン・ロンメル氏がCyclesを設計するときにOpen Shading Languageを拡張して使っていました。OSLはCyclesの開発プロセスで重要な要素でした。今でもその名前とツール類、それからワークフローを見ることができます。OSLは予定していた2つのシェーディングエンジンのうちのひとつでしたが、残念ながらそのときにはまだ動いていませんでした。

CyclesはCPUとGPUの両方でレンダーできるよう意図されていたため、OSLはCPUレンダリングのみで動き、ブレヒト氏が設計した2つ目のシェーディングエンジンはGPUで動いていました。この2つ目のエンジンはCyclesを開発しているときに皆の注目を集めましたが、それはOSLのプロジェクトがちょうど停滞しようとしていた矢先のことでした。

2012年の夏にOSLは稼働可能な状態になりました。それは私が若干のソースコードを読み小さな変更といくつかのデバグが施されたときでしたが、私は2011年時点のシェーダーシステムのすべての変更点をOSLに移植しなければなりませんでした。ルーカス・トン氏と共同作業し実行可能なプロタイプの公開にこぎつけました。

そのときにはすでにトン氏の設計したスクリプトノードが実装されていました。そこでようやくOSLシェーダースクリプトをCyclesで使うことができるようになったのです。

BlenderDiplom:話に聞いていたところではBlenderは2011年と2012年にいくつかのOSLに対応して使えるようになるとのことでしたが、2013年になってもBlenderは依然としてOSLシェーディング市場の独占状態にあります。ほかのエンジンはなぜOSLの採用に手をこまねいているのでしょうか?

トーマス:主な理由は利用可能なOSLが2012年以前にはまだ公開プロジェクトにはなかったからだと思います。「メン・イン・ブラック3」とか「ホテルトランシルバニア」とか「アメイジングスパイダーマン」などが公開され、これらはそれぞれ単独でOSLシェーディングが実際に使われた最初の映画です。それまでOSLはあまり知られていませんでした。

SONYイメージワークスで使われていることが知られていましたが、ほとんどの人はOSLの導入は時期尚早と考え、それで映像を作ることに懐疑的でした。今ではV-RayがOSLを実装する予定との情報があり、FMX 2013でそれが確認されました。

残念ながらそのネタはまだ守秘義務があるので詳細については公式に発表されるまで数週間ばかり待たなければいけません。

BlnderDiplom:それでBlender CyclesはOSLによるパストレーシングエンジンなわけですね。すでにたくさんのスクリプトが書かれたと聞きました。これらのスクリプトはほかのレンダリングエンジンのユーザーにも使えるリソースになるでしょうか?

トーマス:完全に再利用できると思います。それがシェーダー言語が設計された基本概念ですから。ほかのエンジンはおよそRenderman(訳注:ピクサースタジオのシェーダー言語)互換なのでシェーダーを変えても簡単に使えると思います。

ただしOSLの仕様ではない部分、BRDFやシェーダーなどは異なりますが、これらの部分はシンプルな関数呼び出しなのでシェーダー内部でそれを修正することは簡単にできると思います。

たとえばユーザーがプロシージャルテクスチャが実装されているあるシェーダーを使っているとして、ディフューズシェーダーを出力しようとしたら、ほかのエンジン名に名前を変更するだけです。

今のところはまだスクリプトはすべてのOSL対応レンダーエンジンをサポートできているわけではないですが。

BlenderDiplom:つまり再利用が可能で、また将来的にはBlender Cyclesのために書かれたスクリプトも他のレンダーエンジンのユーザーにも使えるというわけですね。

ところでOSLのWebサイトを運営なさっていますが現在のところCyclesでのOSLの使い方のみに限定されているようですが、ほかのレンダリングエンジンについても扱う予定でしょうか?

トーマス:もちろんです!

今のところOpenShading.comはCyclesに注視していますが、それは一般に公開されているレンダーエンジンで唯一のものだからです。

でもほかのエンジンがリリースされたらその情報も追加していきたいと考えています。V-RayなどがOSLをサポートするようになり、たくさんの実用的なOSLスクリプトを集めてユーザーが使えるように便宜を図ることは非常に価値があることだと思います。


訳注:おっさんかと思ってたら若いわ(´・ω・`)

2013年12月31日火曜日

Cyclesでボリュームマテリアルテスト その2

この記事を書いている間に2.69.8にマージされてボリュームシェーダーのノード構成が変わったので参考までにしてください


以前に内蔵レンダーでこういうのを作ったことがあって



要はサーフェスにマテリアルを貼っていない見えないオブジェクトの内側にライトを2個くらい置いて、ボリュームマテリアルに内側から光を当てている。Cyclesで同じことができないかと考えていたら2.7で実装されるらしいと聞いた。ボリュームマテリアルというのは、こういうオブジェクトの内側を点描するような、早く言えば雲とか煙を表現するのに向いている。現在のCyclesにはまだマテリアルをいじれる雲addonはなかった気がする。

Cyclesのシェーダーはもともとサーフェスに貼られたマテリアルを対象としているので内蔵レンダーにあるようなHaloやボリュームには向いてないと聞いているがどうやって実現しているのかかなり興味がある。

svn.blender.orgのDingtoリポジトリをビルドして試してみた。


どら焼きのようなICO球オブジェクトにポイントライトとエリアライトを1個ずつ置いた。色はライトそのものに薄い黄色と白を付けた。球のマテリアルノードはこれだけ。




一見すると星がきれいに表現されているように見えるが実はこれがただのノイズだったりするのだったw
密度を上げてみるとノイズが減って確かにきれいに見えるがボリューム全体がのっぺりしてしまう。オブジェクトの透明感と光のグラデーションの滑らかさは反比例するらしい。

等方性ボリュームのg値については soc-2013-dingto/intern/cycles/kernel/volume.h に以下のようなコメントがあるが:
レイ間に与えられたコサイン値は光子が軌道に沿って反射する確率密度を返す。引数gはそれが球状にどれくらい離れているかを決める。値が0のときデフューズのような形状になり、1のときは鋭い1本の光線のようになる。
このオブジェクトでいう光の減衰に影響するんじゃないかと思う

現在のところCPUレンダーのみ対応。機能セットは実験的にしておく。




Blender Cycles memo( http://cycles.wiki.fc2.com/ )
の翻訳によると、Cyclesのボリュームシェーダは、オブジェクト内を光が通過する際の作用を表現している。ボリューム内を通過する光は任意の点で分散するか吸収するかまたは放射される、とある。ガラスや光沢と組み合わせると氷のようになる、と書いてある。



グラスBSDFを足してみると若干滑らかになる。グラデーションを滑らかにする方法はほかにもあるかもしれない。無論コンポジットでごまかすこともできるのだが、アニメーションした場合フレーム間で微妙なズレが生じ絵の動きによってはチラつきが目立ってしまう。コンポジットは1枚の静止画のレンダー後にレタッチをするのと同じことなので補助的な編集ツールにすぎないと考えている。オブジェクトレベルで高い精度があればいくら動かしても劣化せずに使える。

銀河系



銀河系を作ってみたのだがかなり悩んだ。中心にあるどら焼き型の光はボリューム。外側の渦巻きの4色の点々はパーティクル。赤いガス星雲はボリュームにボロノイを貼っているが最初は綺麗にガスっぽい感じが出てたのにいじりすぎて元に戻せなくなってしまった。以下はガス星雲のマテリアルノード。


霧も光もオブジェクト内にある点の存在は、すべて等方性ボリュームの密度の値で行われる。なのでオブジェクト内の座標(あえてジオメトリの位置として呼称している?)にボロノイやウェーブテクスチャを食わせてスポンジのような効果を作り出すこともできる。千切れ雲とかちぎりこんにゃくの集合みたいな形状も可能らしいのだが、その場合はいずれかのノードのディスプレイス値を使うらしいということしか分からなかった。たぶんマテリアル出力にあるディスプレイスだと思うがやり方がわからない。それが理由でガス星雲の部分はオブジェクトの表面にぺったりと貼り付けたようになっている。

将来修正されるであろう不具合。同じレイヤー上に2つ以上のボリュームオブジェクトがあるとアルファ透過してくれない。同じボリュームマテリアルを貼ったオブジェクト同士は重なった部分がきれいに表現できない。今回はレイヤーを分けてコンポジットで重ねた。同じオブジェクトに複数のマテリアルを重ねられない。

2つ以上のボリュームマテリアルを混ぜて使いたい場合はノードエディタ上で2系統作りミックスか追加シェーダーで合成してやればよい(なかなかうまく混ぜられないが)。

透過させるにはカラーの出ているノードからアルファ値を密度に食わせてやればよい。

散光星雲


レンダー所要時間:46時間37分
(4コア3.6GHz 8Gメモリ CPUレンダリング500サンプル)

冒頭にある散光星雲を作ってみたのだがレンダーにかなり時間かかっちまって、たぶん実装がまだpythonコードだからだと思うがいろいろと調整が必要だということを感じた。レンダータブにある2つのアルゴリズムはそれぞれ特性が違っていて所要時間も違う。実はサンプリング1000と2000も試したのだが開始から2日目くらいでフリーズして諦めて500に戻した。GPUレンダならよくあることだが今回はOSカーネル自体が固まったのでメモリを食い尽くしてしまったのかもしれん。サンプル数を上げていくとスムーズな点の減衰になることは分かった。

ガス部分のマテリアルノード

星雲は単にディスプレイスで凸凹させているので実際にはボリュームが減衰しているわけではない。真ん中にライト代わりの凸凹オブジェクトを埋め込んでいるのでこういう光になっている。
等方性ボリュームを2つにしたのは、上は周辺の赤い部分の色、下は中心に若干赤紫を足したかったためだが、両方をバランスよく出すのは難しかった。この値では外側の赤が強い。ボロノイにノイズテクスチャを食わせているのはblenderartistのスレでこういう使い方をしているのを見て真似してみたのだがどういう原理で機能しているのかは分からない(そもそももっさりとしたCPUレンダーなので値をちまちま変更して変化を見るという検証ができない)。

点の密度が外側に向かって緩やかに減衰していくのを期待しているのだが、思ったようなグラデーションが出ていない。つまり減衰にはサインカーブが使われているはずなのだが内蔵レンダーのボリュームマテリアルで表現されるような減衰が行われていない。
ボリュームマテリアルは霧や雲ジェネレータのような元になるものなのでこういう感じにぷっつり切れてしまうというのは機能的に美しくない。

等方性ボリュームの密度入力にサイン値を与えてみているのだが密度が厳密に何を指すのかわかってないので意味がなかったかもしれない。むしろレンダータブのボリュームセクション内にある「密度係数」を下げるほうが効果があった。係数は乗数らしい。ワールドの点の減衰が綺麗なのはこの値を直接使っているからではないかと思う。むしろ裾野が緩やかに伸びるアークタンジェントのようなカーブが欲しかった。

2つのアルゴリズム

レンダータブにはInhomogeneous(不均一)にRay marchingとWoodcockのアルゴリズムがあるが簡単に言うと:

Ray Marching:レイ上を一定距離のステップでオブジェクトに進み、交点を探索してその点の色を計算するもの。オブジェクトの複雑さと面積に比例して計算量が増加する。割と古くから使われている光子マッピングの手法。光線の上を一歩ずつ歩測する様子からこの名前になっているらしい。

Woodcock:ボリューム中を通過するレイ上の最初の点を探しだす。このときの点の散布は透過率と等しくなる。2点間の透過率は点の間のパスの衝突の平均値になる。Ray Marchingの代替手段として考案されたもので比較的計算が早い。

ということらしい。Ray MarchingはOpenGLなどのCGプログラマがロジックを説明している日本語のページがいくつかあるが、いずれにしてもCG学会で発表される論文レベルの知識が必要なので方程式を見てもなんのことやらだった。


ハンガリーブダペスト情報経済大学の論文(PDF): http://sirkan.iit.bme.hu/~szirmay/woodcock1.pdf


この論文ではWoodcockの利点を解説している。抜粋すると、Ray Marchingのアルゴリズムはボクセルの配列が大きい場合や吸光係数の平均値が小さい場合に大量のボクセル配列を要求する。つまりメモリを消費する。
Woodcockレイトレースは吸光係数(光がある媒体に入射したときどれくらい光を吸収するかを表す定数)が最大値でパスの長さが無制限なサンプリングができ、最大距離でサンプリングしたレイの改善、最大確率の点の使用と不使用の選択などを提供する、また解像度に依存しない自由なパスのサンプリングを提供する、とのことだ。

欠点もいくつかあるらしいのだがいまいち理解できなくて申し訳ない。







Cyclesでのボリュームマテリアルテスト その1

※2.69.8でボリュームシェーダーの構成が変わりました(20140111)

2.7で実装するよと言われているボリュームマテリアルだが内蔵レンダーに匹敵するクオリティを出すのはなかなか難しいようだわ

ボリューム絡みのソースの場所は soc-2013-dingto/intern/cycles/kernel 付近にある
help to speedup noise clear when tiny object or low density.
つまり逆に言えば小さいオブジェクトや解像度が低いものにはノイズが乗りやすいということ?デモをやって見せている以下URLのblenderdiplomでもノイズがまだ改善されてないんだけどねと書いてある。ワールドのマテリアルはわりときれいに表現できているようだ

http://blenderdiplom.com/en/blog/527-demo-volume-with-blender-cycles.html

もともとCyclesのマテリアルはサーフェスに対して有効なので内蔵レンダーにあるような点の集合であるHaloやボリュームマテリアルなどには向いていないらしい。そのせいかブツブツとしたノイズが出ることがある

ソースツリーをすべて把握してるわけじゃないんでそもそもCyclesの概念がどういうもんかまだ知らないんだが今後少しずつでも読んでいこうかと

以下はBlender.orgからの翻訳:

原文: http://wiki.blender.org/index.php/User:DingTo/Volume

Cyclesボリューム

storm氏のパッチをベースにし、Stuart Broadfoot氏と私が共同で修正した。
レンダリングのサンプル: http://blender.dingto.org/volume/

使い方

  • Blenderを起動しCyclesレンダーに切り替える。レンダータブにある"ボリューム"を有効にする。
  • シェーダーの基本的な使い方:"透過BSDF"をマテリアル出力のサーフェスに接続し、"等方性ボリューム"を同じボリュームに接続する。
  • オブジェクトとワールドのマテリアルに有効。
  • 各マテリアルとワールドのボリュームパネルにあるHomogenous(均一)とInhomogenous(不均一)を切り替えて使う