[はじめに]
左はDirectX12でPBRです。
真ん中はカメラからnearZ面においたスクリーンに光線を飛ばし延長して、Objのfaceにhitしたらその点の情報を基にラスタライズ法と同様に色を計算する、半分くらいpathtracingです。
右は途中まで真ん中と一緒ですが、faceにhitした後、光線を多数生成して、光源までfullpathtracingします。なおカメラのレンズは考慮してません。
[使い方]
自身で作成したオブジェクトを描画する場合は、
fileoutput8.pyをblenderのtexteditorで開いて実行してください。
出力されたファイルをMEDIAフォルダーに入れて、setting.txtの4行目にファイル名を書いて保存し、
実行ファイルをクリックして下さい。
[ファイルの出力]
複雑なマテリアルノードには対応してないので、手入力で補完してください。
オブジェクトの面は三角で、適用(loc0rot0scale1)して下さい。
アーマチュアも適用してから関連付けてください。
頂点が影響を受けるdeformboneの数は2にして、すべて正規化(合計1.0)して下さい。
キーフレイムを打つ時には、0を使わず、1にデフォルト状態を打ってください。全ボーンのlocrotscaleを記録してください。
texturefileは、objectfileと同じフォルダに入れて、ファイル名だけ出力するようにして下さい。
mrcMAP(metallicとroughnessと他2成分)を使う場合には、metallicはR成分に、roughnessはG成分に書き込んで下さい。
始めはclearcoatを使ってみたのですが、blenderのようにはならなかったので、今は使ってません。
4成分取得出来るようになっているので、AOなどを使う場合はシェーダーを書き換えて下さい。
mrcMAP→カラー分離→プリンシプルBSDFのmetallic、roughness、clearcoatにつないで下さい。
normalMAPはノーマルマップノード→プリンシプルBSDFのノーマルにつないで下さい。
ボーンアニメがある場合には使いません。
[方法1の説明]
DirectX12でPBR描画です。
1方向からだと反対側が黒くなるので、3方向から光を当ててます。
[方法2]
ボーンアニメがある場合でもnormalMAPを使えます。(方法3でも使えます。)
影は1番目の光に対して計算しています。
[方法3]
ライトオブジェクトの明るさや、描画オブジェクトの面で反射する時のpathの本数、光の閾値によって画像がかなり変わります。時間も変わります。
光線は、オブジェクトにhitするか、しないか、ライトオブジェクトにhitするかのどれかです。
オブジェクトにhitするとnormalvectorを中心として44本の光線を反射します。
その1つ1つがオブジェクトにhitすると、さらに44本ずつ光線を生成します。
フレネル反射とマイクロファセット分布と幾何遮蔽で光線の強度変化を計算して、
閾値より小さい場合は、そこで計算はやめます。
大きい場合は、光線に面積比を掛けて計算を続けます。ライトオブジェクトにhitするまで続けます。
1.faceとfacenormです。2.x、y、z方向を決めました。
3.4.x軸とy軸の間を6等分して、回転させ、半球を作ります。帯の面積を計算します。
5.faceに近い部分を12等分して、その面積に近くなるように他の帯の部分を整数で分割します。
6.光線がfaceにhitするごとに、1+4+9+11+12=44の光線をとばします。
7.面積片を半球の面積2πで割り、反射光の強度にかけます。
8.ライトオブジェクトにhitしたら終わりです。
質問、意見ある方はメールください。
bigwoodssay@yahoo.co.jp
blenderで作ったアニメも見てください。
その1 ペット飼いたい
https://www.youtube.com/watch?v=dBn77DkuZ_M
その2 重量挙げ勝負!
https://www.youtube.com/watch?v=2A6XvNtjTG0
その3 マイペット、エイドリアン
https://www.youtube.com/watch?v=tXe8wtJr_ts
その4 日焼けサロンに行きたい!
https://www.youtube.com/watch?v=T-85SBrRfX0
その5 家の形
https://youtu.be/RN-NqtDvJL4