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)アルゴリズムによる方法です。

  1. 光源から見た時の画像を作り出します。この際は、単純な画像ではなく光源からの奥行きの情報のみを記憶します。これをデプスマップ(depth map)または奥行きマップと呼びます。
  2. 最終のレンダリング時に、デプスマップを利用して影付けを行います。物体上の点と光源との距離がデプスマップに保存されている値と一致した際には、この点は一番光源に物体表面となるため、光があたります。それに対して、デプスマップの値の方が小さい場合には、その点と光源との間に物体があるので影となります。

サンプル(デプスマップ作成用)

# 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"

  1. デプスマップは通常の画像を生成するのとは異なる設定を適用したほうが良いものがあります。例えば、画素の大きさは1X1で良いですし、通常は生成される画像の質を向上させるためにjitter(揺らぎ)処理を加えていますが、それも必要ありません。これらに関連する設定を行っているのが、”# デプスマップ作成時のお勧め設定”の4行と"Format 512 512 1.0"の1.0の部分です。
  2. 生成する画像のサイズは、作成するシーンに応じて決定する必要があります。あまり小さなサイズではきれいな画像を生成することができません。一般的に、この画像の大きさは2の冪乗にすることが多くなっています。このサンプルでは512=2の9乗となっています。例えば、デプスマップを32X32として最終画像を生成すると下のようになってしまいます。
  3. 保存するデータは奥行き情報なので、Display命令の引数を保存するファイル名と"zfile"、"z"としています。カメラの設定において、z軸が奥行き方向となるので、奥行き方向の情報をアルファベットのzで表すことがあります(かなり一般的)。
  4. なるべく正確な奥行き情報を得るためには、なるべ視体積が小さい方が好ましいので、Clipping命令によって、カメラの奥行き方向の見える範囲を狭めています。この例では、カメラからの奥行き距離が1(near)から10(far)までの範囲を見える範囲としています。コンピュータ内で扱える実数の情報は、有限の桁数しかもたないので、なるべく狭い範囲を表すようにした方が、精度良く奥行きの情報を表すことが出来ます。ただし、視体積の狭くしすぎてしまうと、影の情報が正しく描画されないので、注意が必要です。「Clipping 1 3」としてしまうと、下のような図になってしまいます。

    また、Projection命令で指定する画角が小さすぎても正しい画像が生成されません。
  5. 物体の情報は、影が落ちるだの物体(壁や床)などの物体は省きます。この場合では、最終シーンのレンダリング用ファイルにあるPolygonを省いています。面倒であれば、基本的に最終的にレンダリングするものと同じにしても大丈夫です(計算時間が増加するだけ)。なお、色の情報は必要とされないので、色にかかわるような設定は省いても大丈夫です。
  6. 単純な奥行き情報だけでは不十分なので、MakeShadow命令を利用してシャドウマップ用のファイルに変換しています。zfilenameに生成した奥行き情報のファイル名(Displyaで指定したもの)を指定し、生成したいshadowfileにシャドウマップ用のファイル名を指定します。
  7. Clipping命令は、カメラが見える奥行きの範囲を指定するために利用します。z値がnearからfarの間が見える範囲となります。何も設定しない場合には、0よりほんの少し大きな値(RI_EPSILON)からその十分大きな数(RI_INFINITY)となっています。

最終画像作成用

影付きのスポットライト設定用LightSourceの呼び出し方
LightSource "shadowspot" 光源番号 "shadowname" [シャドウマップファイル名] その他の設定

  1. 基本的には影なしのサンプルと同じですが、光源の設定の部分のみが変更されています。
  2. 光源の設定を"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]

  1. シャドウマップによる影付けの際に指定した、LightSourceにおける"shadowname"にファイル名の代わりに"raytrace"とします。
  2. 影を発生させる物体の属性(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" [シャドウマップファイル名] その他の設定

  1. このサンプルでは、色の異なる4本の円柱に左上から光をあてています。床は黄色にしています。
  2. 光源の種類を"shadowdistant"に設定し、"raytraceによって影付けを行う場合には、シャドウマップファイル名に"raytrace"とします。
  3. raytraceによって影付けをする場合の物体属性の設定は、raytraceによるスポットライト光源の影付けの場合と同じです。

点光源による影付け

シャドウマップ法により点光源による影付けを行う場合には、全ての方向への奥行き情報が必要となります。視野角に360度を設定できればよいのですが、これは不可能です。そこで、次の6つの奥行き情報を得ることが出来れば、全ての方向への奥行き情報を得ることが出来ます。
  1. x軸正の方向での奥行き情報
  2. x軸負の方向での奥行き情報
  3. y軸正の方向での奥行き情報
  4. y軸負の方向での奥行き情報
  5. z軸正の方向での奥行き情報
  6. 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軸負方向のシャドウマップファイル名]その他の設定

  1. デプスファイルを作るために6個のファイルを用意するのは面倒なので、FrameBegin〜FrameEnd命令を利用して、1つのファイルで6個のデプスファイルを作る出すようにしています。
  2. カメラ向きをそれぞれx軸正方向(px)、x軸負方向(nx)、y軸正方向(py)、y軸負方向(ny)、z軸正方向(pz)、z軸負方向(nz)の6つの方向へ向け、視野角を(fov)を90度にすればデプスファイルを作成できます。理論的には視野角は90度にしておけば全ての方向を覆うことが出来るはずですが、実際には少し大きな値(ここでは95度)にした方が良い結果が得られるようです。なお、p=positive,n=negativeではないかと思います。
  3. シャドウマップファイル名のところをraytraceに変更すると、raytraceによって影が作られます。やっぱり楽ですよね。この場合には、Attributeで属性を変更することを忘れないように。
  4. カメラを6方向に向かせるための回転は次の表のようになります。
カメラの向き回転方法最後の2文字生成されているFrame
x軸正方向Rotate -90 0 1 0px1番のFrameで生成
y軸正方向Rotate 90 1 0 0py2番のFrameで生成
z軸正方向もともとz軸正方向を向いている、あえて書けばRotate 0 0 1 0pz3番のFrameで生成
x軸負方向Rotate 90 0 1 0nx4番のFrameで生成
y軸負方向Rotate -90 1 0 0ny5番のFrameで生成
z軸負方向Rotate 180 0 1 0nz6番の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
c2231b8f.jpg (13.37KB)
Uploaded by m_riho 2008年01月16日(水) 01:53:10
3067d702.jpg (14.60KB)
Uploaded by m_riho 2008年01月14日(月) 22:16:10
09165708.jpg (6.00KB)
Uploaded by m_riho 2008年01月14日(月) 14:16:29
110675d1.jpg (5.98KB)
Uploaded by m_riho 2008年01月14日(月) 12:58:33
c3cf7f82.jpg (5.94KB)
Uploaded by m_riho 2008年01月14日(月) 12:38:39
0b5a1933.jpg (5.91KB)
Uploaded by m_riho 2008年01月14日(月) 12:11:22
789ecbd3.jpg (6.00KB)
Uploaded by m_riho 2008年01月14日(月) 10:58:11
713fe1b2.jpg (5.63KB)
Uploaded by m_riho 2008年01月14日(月) 10:52:52
21cd88c9.jpg (5.81KB)
Uploaded by m_riho 2008年01月14日(月) 01:42:52



スマートフォン版で見る