投稿

2月, 2021の投稿を表示しています

LuxCoreRenderで光源をスペクトルで指定する方法

イメージ
 LuxCoreRenderは、テクスチャを使って光源のスペクトル指定をする。 テクスチャの指定方法は、次の3つがある。 ・黒体温度(blackbody) 色温度を指定する方法。たとえば、電球色なら色温度3000Kくらいで、白昼色なら、色温度5000Kくらいとなる。主な色温度として以下が紹介されている。 Candles (1850K) Incandescent (2700) Halogen (3000K) Fluorescent (4200) The sun (5000-6500K) シーン例: scene.textures.lighttex.type = blackbody scene.textures.lighttex.temperature = 3000 scene.textures.lighttex.normalize = 1 scene.materials.whitelight.emission = lighttex scene.materials.whitelight.emission.gain = 120.0 120.0 120.0 色温度3000Kなので、電球色となる。normalize(正規化)をonにしてemission.gainで光量を設定すると、得たい光量通りの明るさになる。 ・スペクトル(irregulardata) スペクトル波長(wavelength)と強度(data)の列で指定する。 シーン例: scene.textures.lighttex.type = irregulardata scene.textures.lighttex.wavelengths = 536 560 576 scene.textures.lighttex.data = 0.0001 0.1 0.0001 scene.materials.whitelight.emission = lighttex 536nm~576nmの広がりを持ち、560nmをピークとした。やや黄色がかった緑色の光になる。シーンでは、赤い箱はやや暗めに描画されている。これは、赤が反射できるスペクトル成分量が少ないためと考えられる。後ろの青い壁は、完全に真っ黒なのは、青色のスペクトルを一切持っていない為である。ちなみに、こちらの場合、gainを設定せず、dataの強度をそのまま使用して...

LuxCoreRenderを使ってみる2

イメージ
 simple.scnをいじりながら、何ができるかの挙動を確認した。 カメラの座標 カメラの座標を下記のようにすると、エラーがでる。 scene.camera.lookat.orig = 0.0 0.0 10.0 scene.camera.lookat.target = 0.0 0.0 1.0 エラーの内容: Singular matrix in MatrixInvert: -nan(ind) -nan(ind) -nan(ind) 0 -nan(ind) -nan(ind) -nan(ind) 0 0 0 -1 0 0 0 10 1 singular matrixというものが、非正則行列と呼ばれるもので、MatrixInvertというのが、逆行列の算出だとすると、逆行列を計算しようとしている行列が正則行列でないということと考える。今回の場合は、行列要素にnanが入っていて計算できないようで、nanの部分には、カメラ座標を基に算出されると考える。nanとして考えらえる値は「無限大」くらいしか思いつかないので、1/0を計算する事態になったと考える。 今のところ、origとtargetの座標が同一ベクトルの場合、上記エラーが出ることが分かっている。たとえば、下記なら問題ない。 scene.camera.lookat.orig = 0.0 -10.0 2.0 scene.camera.lookat.target = 0.0 0.0 2.0 マテリアル scene.materials.redmatte.type = glossytranslucent scene.materials.redmatte.kd = 0.5 0.0 0.0 scene.materials.redmatte.kt = 0.5 0.0 0.0 scene.materials.redmatte.ks = 0.5 0.0 0.0 scene.materials.redmatte.ks_bf = 0.5 0.0 0.0 scene.materials.greenmatte.type = metal2 変形 平行移動はできないことが分かっている。 scene.objects.box2.transformation = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 scene.obje...

LuxCoreRenderを使ってみる

イメージ
まずはレンダリング 下記より、スタンドアロンとAPI SDKをダウンロードする。 https://luxcorerender.org/download/ それぞれ適当なフォルダに展開する(私の場合Cドライブ直下に置いた)。スタンドアロンのフォルダにある、luxcoreui.exe を実行する。出てきたウインドウのRendering→Loadを選択して、SDKのフォルダにあるscenesの下にあるフォルダの中から、適当なcfgファイルを選択すると、レンダリングが開始する。下の画像は、scenes/simple/simple.cfgを選択した場合の画像である。 最初ノイズまみれな画像から、だんだんときれいになっていく様子を見ることができる。ずっとレンダリングし続けるので、止める場合は、Rendering→Pauseを選択する。再開するときは、Rendering→Resumeを押す。 上のウインドウとは別で表示されているコンソールに、以下のようなものが出力され続けるのだが、どうやら処理を進めることで、ノイズが少なくなるということらしい。 [LuxCore][31.734] Noise estimation: first pass [LuxCore][59.578] Noise estimation: Error mean = 0.00993405 [LuxCore][101.531] Noise estimation: Error mean = 0.00612393 [LuxCore][142.218] Noise estimation: Error mean = 0.00357345 [LuxCore][180.250] Noise estimation: Error mean = 0.00257599 [LuxCore][218.015] Noise estimation: Error mean = 0.00201924 [LuxCore][258.171] Noise estimation: Error mean = 0.00166048 [LuxCore][301.125] Noise estimation: Error mean = 0.00140384 [LuxCore][339.734] Noise estimation: Error mean = 0.00...

ラジオシティ

イメージ
どうやら、フォトンマッピングとラジオシティは計算が別なので、相互作用をシミュレートできないようだ… 実際、ラジオシティを有効にした状態でレンズがなくても、見た目が同じようになる。 レンズあり レンズ無し リファレンスマニュアルでは、これらを相互作用させる方法は見つけられなかった。つまり、POV-Rayではこれ以上どうしようもないということになる。 レイトレーシングについて色々調べていると、物理ベースレンダリングというものを見つけた。ツールとしては、LuxCoreRendarというものを見つけた。これについて調べてみようと思う。 下記は、ラジオシティの項の翻訳となる。 3.4.4.3 Radiosity 3.4.4.3.1 Radiosity Basics ラジオシティは、拡散相互反射をよりリアルに計算する手法です。この拡散相互反射は、青いカーペット、青い壁、青いカーテンの部屋に白い椅子を置くと、その現象を見ることができます。椅子は、部屋の椅子以外の場所から反射する光によって、青っぽくなります。その表面を光が直接照らしていなくても、完全に真っ黒な影にならないことに気づくでしょう。ほかの物体から反射してきた拡散光が影を塗りつぶします。レイトレーシングでは、これをシミュレートするのに「環境光」を用いますが、これは正確ではないです。 ラジオシティの計算は、global_settingの中に、radiosityブロックがある場合に行われます。 以下のセクションでは、ラジオシティがどのように働き、global_settingによってどのようにコントロールされ、品質とスピードのトレードオフについて説明します。 3.4.4.3.2 How Radiosity Works レイトレーシングは、シーン内で見えるそれぞれの点での光のレベルが、どれくらいかを示す事を課題としています。従来、レイトレーシングでは、以下の要素の和として分解できます。 拡散:物体側面を明るくする効果 スペキュラ:輝いている物体がキラキラする効果 反射:鏡のように反射する効果 アンビエント:あらゆるシーンが持つ一般的な全体の光で、影が真っ黒にならないようにしている Greg Wardの手法に基づくPOV-Rayのラジオシティは、最終項?を 近傍表面の状態とその明るさの順番に基づく明るさレベルに置き換えるものです(?...

フォトンマッピング

POV-Rayのフォトンマッピングでは、何が可能なのかを、下記を翻訳して確認することにした。 http://www.povray.org/documentation/3.7.0/r3_4.html#r3_4_4_4 結果として、そもそもこのフォトンマッピングには、反射と屈折しか定義がなく、散乱という概念がないことに気づいた。散乱による反射をシミュレートしているのは、ラジオシティのみと考えられるので、今度はラジオシティの項目を確認しようと思う。 今回訳したもののうち、冒頭部分を下記に記載する。 3.4.4.4 Photons Photonsによって、現実の反射や屈折のコースティクス(光の紋様や筋のこと)をレンダリングできます。フォトンマッピングは、Henrik Wann Jensenによってはじめて導入されました。 フォトンマッピングは、反射や屈折のコースティックを写実的にレンダリングする為の、前方レイトレーシング前処理?を用いる技術です。 フォトンマッピングは、光源から光のパケット(フォトン)をシーン内で発射することで機能しています。フォトンが、ターゲットとなっている物体を通った(あるいは跳ね返った)後に、ある物体にぶつかると、その衝突点がメモリに保存されます。このデータは、反射や屈折によって生じる光の量を計算するのに使用します。 3.4.4.4.2 Using Photon Mapping in Your Scene フォトンマッピングを使ってシーンを設計する場合、オブジェクトは2つのカテゴリに分けて考えるとよいです。一つは、コースティックが描かれる物体で、もう一つは、フォトンを屈折させたり、反射したりする物体がありあす。物体はどちらかに分類されるか、どちらにも属さない場合があります。 カテゴリ1:コーステックが現れる物体 デフォルトでは、すべての物体が、カテゴリ1になります。フォトンがカテゴリ1の物体にあたる度に保存され、その物体にコーステックを描くために使用されます。これはつまり、デフォルトでは、あらゆる物体の表面にコーステックを描くことができるということです。レンダリングを高速にするためには、物体をこのカテゴリから外しておくとよいです。やり方としては、photons{collect off}を追加しておけばよいです。この構文を使えば、コーステックがその物体に...

反射光と拡散光

イメージ
 前回まで、レンズによる結像を見てきたが、レンズを通過する光は光源からの光で、いわゆる透過光を見ているイメージなのだが、正反射光や拡散光も結像させたい。 実験系 反射光を見るために、下図のように赤色の鏡を45度の傾けて、横からスポット光を入れて撮像面に当てる形を作って実験した。 正反射光 finish{reflection 1.0} 正反射の場合、光源の色が見える。光もスポットとして見えており、正しく結像していると考えられる。 拡散光 finish処理なし 物体を鏡面でなくした状態にしたら、拡散光が得られるのか実験した。結果、真っ暗な像しか得られなかった。これは、フォトンマッピングのアルゴリズムとして、反射しない物体に到達すると、そこから再度放出されるフォトンが、ゼロになってしまう為と考えられる。 フォトンマッピングをWikipediaで調べると、拡散相互反射(diffuse interreflection)、表面下散乱(subsurface scattering)は、原理的には実現できるようだが、POV-Rayでどうやるのかがまだ分かっていない。 ちなみに、別のグローバルイルミネーションの方法として、ラジオシティがある。これをONにしたうえで、光源のrgb値を<500,500,500>などとすると、真っ黒ではない像が得られるが、像の形がおかしいうえに、結像位置がレンダリング毎に変わる。これは、拡散面からランダムに放射した光をとらえているからではと考える。ランダムな光だから、像の形もおかしくなると考える。ただ、像の色が赤であることから、素材の色がちゃんと見えている点だけは正しくシミュレートされている。 フォトンマッピングのパラメータをもう少し調べる必要がありそう。