RenderManのお勉強(影付け)
RenderManでは、何も設定をしないと影付けが行われません。従って、影付けをするための工夫(設定)が必要となります。
ここでは、まずはスポットライトによってできる影を扱います。
影なしサンプル
ここでは、2つの球とその影を落とすつもりのポリゴンから出来上がっているシーンです。2つの球は雪だるまのようy軸上に位置をずらして配置されており、斜め上からスポットライトで照らしています。
サンプル
#noshadow01.rib Display "noshadow01.tiff" "file" "rgba" Projection "perspective" "fov" [45] Rotate -15 1 0 0 Translate 0 -1 5 WorldBegin LightSource "ambientlight" 1 "intensity" [0.1] LightSource "spotlight" 2 "from" [1 4 0] "to" [0 0 0] "intensity" [ 7 ] "coneangle" [0.3] "conedeltaangle" [0.05] Surface "plastic" Color [1 0 0] Sphere 0.8 -0.8 0.8 360 TransformBegin Color [0 0 1] Translate 0 1 0 Sphere 0.5 -0.5 0.5 360 TransformEnd Color [0 1 0] Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] WorldEnd
サンプルの実行例
シャドウマップによる影付け(スポットライト版)
RenderManにおいてもっとも一般的な影付けの方法は、シャドウマップ(shadow map)アルゴリズムによる方法です。- 光源から見た時の画像を作り出します。この際は、単純な画像ではなく光源からの奥行きの情報のみを記憶します。これをデプスマップ(depth map)または奥行きマップと呼びます。
- 最終のレンダリング時に、デプスマップを利用して影付けを行います。物体上の点と光源との距離がデプスマップに保存されている値と一致した際には、この点は一番光源に物体表面となるため、光があたります。それに対して、デプスマップの値の方が小さい場合には、その点と光源との間に物体があるので影となります。
サンプル(デプスマップ作成用)
# makeshadow01.rib PixelSamples 1 1 # デプスマップ作成時のお勧め設定 PixelFilter "box" 1 1 # デプスマップ作成時のお勧め設定 Hider "hidden" "jitter" [0] # デプスマップ作成時のお勧め設定 ShadingRate 4 # デプスマップ作成時のお勧め設定 Format 512 512 1.0 # 画像の大きさは2の冪乗にするのが一般的 Clipping 1 10 # なるべく視体積を小さくした方がよい Display "zbuffer01.tiff" "zfile" "z" #デプス(奥行き)情報を保存 Projection "perspective" "fov" [60] Translate -1 0 4 Rotate -90 1 0 0 WorldBegin Sphere 0.8 -0.8 0.8 360 TransformBegin Translate 0 1 0 Sphere 0.5 -0.5 0.5 360 TransformEnd WorldEnd MakeShadow "zbuffer01.tiff" "map01.shad"
サンプル(最終画像作成用)
# withshadow01.rib Display "withshadow01.tiff" "file" "rgba" Projection "perspective" "fov" [45] Rotate -15 1 0 0 Translate 0 -1 5 WorldBegin LightSource "ambientlight" 1 "intensity" [0.1] LightSource "shadowspot" 2 "shadowname" ["map01.shad"] "from" [1 4 0] "to" [0 0 0] "intensity" [ 7 ] "coneangle" [0.3] "conedeltaangle" [0.05] Surface "plastic" TransformBegin Color [0 0 1] Translate 0 1 0 Sphere 0.5 -0.5 0.5 360 TransformEnd Color [1 0 0] Sphere 0.8 -0.8 0.8 360 Color [0 1 0] Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] WorldEnd
実行結果
説明
ここで利用しているサンプルのシーンは、「影なしサンプル」で利用したものと同じになっています。デプスマップ作成用サンプル
デプスマップ作成用のサンプルは、シャドウマップアルゴリズムの1に対応する処理を行っています。Clipping命令の呼び出し方 |
Clipping near far |
MakeShadow命令の呼び出し方 |
MakeShadow zfilename shadowfile |
奥行き情報をつく際のDisplay命令 |
Display zfilename "zfile" "z" |
- デプスマップは通常の画像を生成するのとは異なる設定を適用したほうが良いものがあります。例えば、画素の大きさは1X1で良いですし、通常は生成される画像の質を向上させるためにjitter(揺らぎ)処理を加えていますが、それも必要ありません。これらに関連する設定を行っているのが、”# デプスマップ作成時のお勧め設定”の4行と"Format 512 512 1.0"の1.0の部分です。
- 生成する画像のサイズは、作成するシーンに応じて決定する必要があります。あまり小さなサイズではきれいな画像を生成することができません。一般的に、この画像の大きさは2の冪乗にすることが多くなっています。このサンプルでは512=2の9乗となっています。例えば、デプスマップを32X32として最終画像を生成すると下のようになってしまいます。
- 保存するデータは奥行き情報なので、Display命令の引数を保存するファイル名と"zfile"、"z"としています。カメラの設定において、z軸が奥行き方向となるので、奥行き方向の情報をアルファベットのzで表すことがあります(かなり一般的)。
- なるべく正確な奥行き情報を得るためには、なるべ視体積が小さい方が好ましいので、Clipping命令によって、カメラの奥行き方向の見える範囲を狭めています。この例では、カメラからの奥行き距離が1(near)から10(far)までの範囲を見える範囲としています。コンピュータ内で扱える実数の情報は、有限の桁数しかもたないので、なるべく狭い範囲を表すようにした方が、精度良く奥行きの情報を表すことが出来ます。ただし、視体積の狭くしすぎてしまうと、影の情報が正しく描画されないので、注意が必要です。「Clipping 1 3」としてしまうと、下のような図になってしまいます。
また、Projection命令で指定する画角が小さすぎても正しい画像が生成されません。
- 物体の情報は、影が落ちるだの物体(壁や床)などの物体は省きます。この場合では、最終シーンのレンダリング用ファイルにあるPolygonを省いています。面倒であれば、基本的に最終的にレンダリングするものと同じにしても大丈夫です(計算時間が増加するだけ)。なお、色の情報は必要とされないので、色にかかわるような設定は省いても大丈夫です。
- 単純な奥行き情報だけでは不十分なので、MakeShadow命令を利用してシャドウマップ用のファイルに変換しています。zfilenameに生成した奥行き情報のファイル名(Displyaで指定したもの)を指定し、生成したいshadowfileにシャドウマップ用のファイル名を指定します。
- Clipping命令は、カメラが見える奥行きの範囲を指定するために利用します。z値がnearからfarの間が見える範囲となります。何も設定しない場合には、0よりほんの少し大きな値(RI_EPSILON)からその十分大きな数(RI_INFINITY)となっています。
最終画像作成用
影付きのスポットライト設定用LightSourceの呼び出し方 |
LightSource "shadowspot" 光源番号 "shadowname" [シャドウマップファイル名] その他の設定 |
- 基本的には影なしのサンプルと同じですが、光源の設定の部分のみが変更されています。
- 光源の設定を"spotlight"から影をつけることの出来る光源"shadowspot"に変更しています。また、影をつける際にシャドウマップの情報が必要となるので、そのためのファイル名の設定「 "shadowname" ["map01.shad"]」と追加しています。
raytraceによる影付け(スポットライト版)
ここでは、raytraceによる影付けの方法を扱います。シャドウマップによる影付けには、実行結果が速いことや様々な処理を加えやすいとうメリットがありますが、raytraceによる方法では自動的に影付けができるというメリットがあります。raytraceによる影付けサンプル
#withshadow-ray01.rib Display "withshadow-ray01.tiff" "file" "rgba" Projection "perspective" "fov" [45] Rotate -15 1 0 0 Translate 0 -1 5 WorldBegin LightSource "ambientlight" 1 "intensity" [0.1] LightSource "shadowspot" 2 "shadowname" ["raytrace"] "from" [1 4 0] "to" [0 0 0] "intensity" [ 7 ] "coneangle" [0.3] "conedeltaangle" [0.05] Surface "plastic" Attribute "visibility" "int transmission" [1] TransformBegin Color [0 0 1] Translate 0 1 0 Sphere 0.5 -0.5 0.5 360 TransformEnd Color [1 0 0] Sphere 0.8 -0.8 0.8 360 Attribute "visibility" "int transmission" [0] #これは無くても大丈夫。 Color [0 1 0] Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] WorldEnd
実行例
説明
raytraceによる影生成時のAttributeの設定 |
Attribute "visibility" "int transmission" [1] |
- シャドウマップによる影付けの際に指定した、LightSourceにおける"shadowname"にファイル名の代わりに"raytrace"とします。
- 影を発生させる物体の属性(Attribute)を、Attribute命令(Attribute "visibility" "int transmission" [1])によって変更します。この設定を解除(?)するためには、「Attribute "visibility" "int transmission" ["0"]」とします。
raytraceによる影付け(平行光源版)
ここでは、平行光源による影付けを扱います。平行光源による影付けをシャドウマップ法に利用して行う場合には、平行投影でデプスマップを作成すれば良いのですが、ちょっと面倒そうです。そこで、raytraceによる方法を紹介します。影付けのサンプル
#withshadow-ray02.rib Display "withshadow-ray02.tiff" "file" "rgba" Projection "perspective" "fov" [45] Rotate -15 1 0 0 Translate 0 -1 5 WorldBegin LightSource "ambientlight" 1 "intensity" [0.1] LightSource "shadowdistant" 2 "shadowname" ["raytrace"] "to" [1 -0.5 0.2] "intensity" [ 8 ] Surface "plastic" Attribute "visibility" "int transmission" [1] Rotate -10 0 1 0 TransformBegin Color [1 0 0] Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd TransformBegin Color [0 1 0] Rotate 90 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd TransformBegin Color [0 0 1] Rotate 180 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd TransformBegin Color [0 1 1] Rotate 270 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd Attribute "visibility" "int transmission" [0] Color [0 1 1] Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] WorldEnd
実行結果
説明
平行光源による影付き用LightSourceの呼び出し方 |
LightSource "shadowdistant" 光源番号 "shadowname" [シャドウマップファイル名] その他の設定 |
- このサンプルでは、色の異なる4本の円柱に左上から光をあてています。床は黄色にしています。
- 光源の種類を"shadowdistant"に設定し、"raytraceによって影付けを行う場合には、シャドウマップファイル名に"raytrace"とします。
- raytraceによって影付けをする場合の物体属性の設定は、raytraceによるスポットライト光源の影付けの場合と同じです。
点光源による影付け
シャドウマップ法により点光源による影付けを行う場合には、全ての方向への奥行き情報が必要となります。視野角に360度を設定できればよいのですが、これは不可能です。そこで、次の6つの奥行き情報を得ることが出来れば、全ての方向への奥行き情報を得ることが出来ます。- x軸正の方向での奥行き情報
- x軸負の方向での奥行き情報
- y軸正の方向での奥行き情報
- y軸負の方向での奥行き情報
- z軸正の方向での奥行き情報
- z軸負の方向での奥行き情報
サンプルでは色と太さの異なる4本の円柱が配置されています。
シャドウマップによる影付けのサンプル(デプスマップ作成用)
#withshadow-ray03.rib : point light Projection "perspective" "fov" [95] PixelSamples 1 1 PixelFilter "box" 1 1 Hider "hidden" "jitter" [0] ShadingRate 4 Format 1024 1024 1.0 Clipping 0.1 10 ObjectBegin 1 TransformBegin Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.6 -1 2 360 TransformEnd TransformBegin Rotate 90 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd TransformBegin Rotate 180 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.4 -1 2 360 TransformEnd TransformBegin Rotate 270 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.3 -1 2 360 TransformEnd Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] ObjectEnd FrameBegin 1 Display "zbuffer02px.tiff" "zfile" "z" Translate 0 -0.5 0 Rotate -90 0 1 0 WorldBegin Rotate -15 0 1 0 ObjectInstance 1 WorldEnd MakeShadow "zbuffer02px.tiff" "map02px.shad" FrameEnd FrameBegin 2 Display "zbuffer02py.tiff" "zfile" "z" Translate 0 -0.5 0 Rotate 90 1 0 0 WorldBegin Rotate -15 0 1 0 ObjectInstance 1 WorldEnd MakeShadow "zbuffer02py.tiff" "map02py.shad" FrameEnd FrameBegin 3 Display "zbuffer02pz.tiff" "zfile" "z" Translate 0 -0.5 0 WorldBegin Rotate -15 0 1 0 ObjectInstance 1 WorldEnd MakeShadow "zbuffer02pz.tiff" "map02pz.shad" FrameEnd FrameBegin 4 Display "zbuffer02nx.tiff" "zfile" "z" Translate 0 -0.5 0 Rotate 90 0 1 0 WorldBegin Rotate -15 0 1 0 ObjectInstance 1 WorldEnd MakeShadow "zbuffer02nx.tiff" "map02nx.shad" FrameEnd FrameBegin 5 Display "zbuffer02ny.tiff" "zfile" "z" Translate 0 -0.5 0 Rotate -90 1 0 0 WorldBegin Rotate -15 0 1 0 ObjectInstance 1 WorldEnd MakeShadow "zbuffer02ny.tiff" "map02ny.shad" FrameEnd FrameBegin 6 Display "zbuffer02nz.tiff" "zfile" "z" Translate 0 -0.5 0 Rotate 180 0 1 0 WorldBegin Rotate -15 0 1 0 ObjectInstance 1 WorldEnd MakeShadow "zbuffer02nz.tiff" "map02nz.shad" FrameEnd
シャドウマップによる影付けのサンプル(最終画像作成用)
#withshadow02.rib : point light & shadowmap Display "withshadow02.tiff" "file" "rgba" Projection "perspective" "fov" [60] Rotate -15 1 0 0 Translate 0 -1 5 WorldBegin LightSource "ambientlight" 1 "intensity" [0.2] LightSource "shadowpoint" 2 "shadowname_px" ["map02px.shad"] "shadowname_py" ["map02py.shad"] "shadowname_pz" ["map02pz.shad"] "shadowname_nx" ["map02nx.shad"] "shadowname_ny" ["map02ny.shad"] "shadowname_nz" ["map02nz.shad"] "from" [0 0.5 0] "intensity" [ 8 ] Surface "plastic" Rotate -15 0 1 0 TransformBegin Color [1 0 0] Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.6 -1 2 360 TransformEnd TransformBegin Color [0 1 0] Rotate 90 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd TransformBegin Color [0 0 1] Rotate 180 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.4 -1 2 360 TransformEnd TransformBegin Color [0 1 1] Rotate 270 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.3 -1 2 360 TransformEnd Color [1 1 0] Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] WorldEnd
実行結果
raytraceによる影付けのサンプル
#withshadow-ray04.rib : point light & shadowmap Display "withshadow-ray04.tiff" "file" "rgba" Projection "perspective" "fov" [60] Rotate -15 1 0 0 Translate 0 -1 5 WorldBegin LightSource "ambientlight" 1 "intensity" [0.2] LightSource "shadowpoint" 2 "shadowname_px" ["raytrace"] "shadowname_py" ["raytrace"] "shadowname_pz" ["raytrace"] "shadowname_nx" ["raytrace"] "shadowname_ny" ["raytrace"] "shadowname_nz" ["raytrace"] "from" [0 0.5 0] "intensity" [ 8 ] Rotate -15 0 1 0 Surface "plastic" Attribute "visibility" "int transmission" [1] TransformBegin Color [1 0 0] Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.6 -1 2 360 TransformEnd TransformBegin Color [0 1 0] Rotate 90 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.5 -1 2 360 TransformEnd TransformBegin Color [0 0 1] Rotate 180 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.4 -1 2 360 TransformEnd TransformBegin Color [0 1 1] Rotate 270 0 1 0 Translate 0 0 2 Rotate -90 1 0 0 Cylinder 0.3 -1 2 360 TransformEnd Attribute "visibility" "int transmission" [0] Color [1 1 0] Polygon "P" [-5 -1 -5 -5 -1 5 5 -1 5 5 -1 -5] WorldEnd
実行結果
説明
点光源による影付き用LightSourceの呼び出し方 |
LightSource "shadowpoint" 光源番号 "shadowname_px" [x軸正方向のシャドウマップファイル名] "shadowname_nx" [x軸負方向のシャドウマップファイル名]"shadowname_py" [y軸正方向のシャドウマップファイル名] "shadowname_ny" [y軸負方向のシャドウマップファイル名]"shadowname_pz" [z軸正方向のシャドウマップファイル名] "shadowname_nz" [z軸負方向のシャドウマップファイル名]その他の設定 |
- デプスファイルを作るために6個のファイルを用意するのは面倒なので、FrameBegin〜FrameEnd命令を利用して、1つのファイルで6個のデプスファイルを作る出すようにしています。
- カメラ向きをそれぞれx軸正方向(px)、x軸負方向(nx)、y軸正方向(py)、y軸負方向(ny)、z軸正方向(pz)、z軸負方向(nz)の6つの方向へ向け、視野角を(fov)を90度にすればデプスファイルを作成できます。理論的には視野角は90度にしておけば全ての方向を覆うことが出来るはずですが、実際には少し大きな値(ここでは95度)にした方が良い結果が得られるようです。なお、p=positive,n=negativeではないかと思います。
- シャドウマップファイル名のところをraytraceに変更すると、raytraceによって影が作られます。やっぱり楽ですよね。この場合には、Attributeで属性を変更することを忘れないように。
- カメラを6方向に向かせるための回転は次の表のようになります。
カメラの向き | 回転方法 | 最後の2文字 | 生成されているFrame |
x軸正方向 | Rotate -90 0 1 0 | px | 1番のFrameで生成 |
y軸正方向 | Rotate 90 1 0 0 | py | 2番のFrameで生成 |
z軸正方向 | もともとz軸正方向を向いている、あえて書けばRotate 0 0 1 0 | pz | 3番のFrameで生成 |
x軸負方向 | Rotate 90 0 1 0 | nx | 4番のFrameで生成 |
y軸負方向 | Rotate -90 1 0 0 | ny | 5番のFrameで生成 |
z軸負方向 | Rotate 180 0 1 0 | nz | 6番のFrameで生成 |
Topページに戻る
2008年02月02日(土) 17:15:50 Modified by m_riho
添付ファイル一覧(全10件)
38ccf8ba.jpg (13.37KB)
Uploaded by m_riho 2008年01月16日(水) 02:28:04
Uploaded by m_riho 2008年01月16日(水) 02:28:04
c2231b8f.jpg (13.37KB)
Uploaded by m_riho 2008年01月16日(水) 01:53:10
Uploaded by m_riho 2008年01月16日(水) 01:53:10
3067d702.jpg (14.60KB)
Uploaded by m_riho 2008年01月14日(月) 22:16:10
Uploaded by m_riho 2008年01月14日(月) 22:16:10
09165708.jpg (6.00KB)
Uploaded by m_riho 2008年01月14日(月) 14:16:29
Uploaded by m_riho 2008年01月14日(月) 14:16:29
110675d1.jpg (5.98KB)
Uploaded by m_riho 2008年01月14日(月) 12:58:33
Uploaded by m_riho 2008年01月14日(月) 12:58:33
c3cf7f82.jpg (5.94KB)
Uploaded by m_riho 2008年01月14日(月) 12:38:39
Uploaded by m_riho 2008年01月14日(月) 12:38:39
0b5a1933.jpg (5.91KB)
Uploaded by m_riho 2008年01月14日(月) 12:11:22
Uploaded by m_riho 2008年01月14日(月) 12:11:22
789ecbd3.jpg (6.00KB)
Uploaded by m_riho 2008年01月14日(月) 10:58:11
Uploaded by m_riho 2008年01月14日(月) 10:58:11
713fe1b2.jpg (5.63KB)
Uploaded by m_riho 2008年01月14日(月) 10:52:52
Uploaded by m_riho 2008年01月14日(月) 10:52:52
21cd88c9.jpg (5.81KB)
Uploaded by m_riho 2008年01月14日(月) 01:42:52
Uploaded by m_riho 2008年01月14日(月) 01:42:52