<< 11/15 >>
AutoRIB
RenderManを使っていく中で、シャドーマップ生成は手作業ではとても面倒で敬遠されてしまうところですが、RibFilterを使って自動生成してみました。
既にRibFilterは開発続いていないし、MacOS8.6でしか作動しない。RIBを編集してくれるツールがないかSourceForge探していたら、ありました!!
AutoRIB。
AutoRIBは、シャドーマップや環境マップの生成ができるし、他にできることがあるようで、サンプル見ながら、練習ですね。特定のOSに依存しないようにjavaで作られている。jrManと組み合わせれば、フリーでRenderManここまでできるかなってことにならないでしょうか。
ダウンロードしたバイナリautorib_0.81_bin.gzを解凍します。2回解凍したら、autorib.jarやマニュアルが出てきます。
java -jar autorib.jar test.ist test.rib
とやって
prman test_.rib
とやると、
PixelSamples 4 4とあげましたが、
shadowpointでの計算
RibFilterで使っていたRIBも、整理してきちんと出力しました。
これは面白いですね。RenderManの勉強になります。
開発者peter quintさんは、AutoRIBの他に、mentalrayのコンバータ、shader開発をされてますね。
ありがとうございます。
AutoRIB その2
AutoRIBから出力されたRenderManのRIBには、
前の記事のコーンの影が離れていた。
Option "shadow" "bias0" [0.15] "bias1" [0.15]
を追加した。
shadowspotもデフォルトのものにし、widthを上げた。
LightSource "shadowspot" 1 "from" [ -1 1 0 ] "to" [ -0.292893 0.292893
0 ] "intensity" [ 1 ] "coneangle" [ 1.0472 ] "conedeltaangle" [ 0.174533
] "width" [4] "float samples" [32] "shadowname" [ "cone9_F_L1.shad" ]
くりかえしRenderManの勉強します。
AutoRIB サンプル
RenderManを使いこなすための勉強になります。
AutoRIBのサンプルをいくつかやってみました。
Distantlightの自動影生成
色を変更する
反射マップの設定、映り込み
ちょっと力業、ambient occulusion
課題はたくさんありますね。ありがとうございます。
AutoRIB その3
サンプルにあるlightdomeいろいろと試してみた。
RenderMan 元になるRIBに、レイトレーシング関連のAttributeを
たとえば、
Attribute "visibility" "int diffuse" 1 # make objects visible to rays
Attribute "visibility" "int specular" 1 # make objects visible to rays
Attribute "trace" "bias" 0.005
と。加えておくと、出力したAutoRIBでは各オブジェクトのAttributeブロックに書き込まれていた。これは、コメントアウトしたり調整すれば良い。
以下はレイトレーシングを使わないで疑似AOのInstruction Fileです。
36個のshadowspotを加えています。明るさを調整し、
LightSource "ambientlight" 1 "intensity" [0.01 ] "lightcolor" [0.85098 1 1]と影響を与えないように暗めにしました。
Option "depthfilter" "midpoint"
Option "convertshadows" 0
Option "zdriver" "shadow"
LightDome 33 [0 0 1] "shadowspot" 1000 1
Objects {
Surface "*" "plastic"
}
Lights
{
ForShaders "light" "shadowspot"
{
Omit "floor"
MapFormat 512 512
AppendParam "light" "intensity" [ 220 ] "uniform float"
AppendParam "light" "width" [ 8 ] "uniform float" //introduce a bit of softness
AppendParam "light" "samples" [16] "uniform float"
ShadowSpot "shadowname"
}
}
まだまだ実験する必要がありますが、
AutoRIBのlightdome機能いろいろと使っていきたいところです。
ありがとうございます。RenderMan面白い。
AutoRIB その4
RibFilterでやってみたサンプルをAutoRIBで試してみた。段取りさえよければうまくいきます。
元となるRnderMan RIB
#kyu_ref.rib
Display "kyu_ref.tif" "framebuffer" "rgb"
Projection "perspective" "fov" 20
Format 480 360 1
Imager "background" "color background" [0.2 0.4 0.6]
# placecam 10 5 -10 0 0 0
Rotate -19.47 1.00 0.00 0.00
Rotate 45.00 0.00 1.00 0.00
Translate -10.00 -5.00 10.00
WorldBegin
LightSource "ambientlight" 1 "intensity" [0.1]
Declare "intensity" "uniform float"
Declare "from" "uniform point"
Declare "shadows" "string"
Attribute "light" "shadows" ["off"]
LightSource "pointlight" 2 "from" [ 10 10 -10] "intensity" [250.0]
LightSource "pointlight" 3 "from" [ -10 10 -10] "intensity" [250.0]
AttributeBegin
Attribute "identifier" "name" ["dome"]
Color [0.2773 0.2855 0.6679]
Opacity [1 1 1]
Surface "matte"
Sphere 40 -40 40 360
AttributeEnd
AttributeBegin
Attribute "identifier" "name" ["kyu1"]
Translate 0 0 0
Color [0.921875 0.796875 0.91796875]
Surface "shinymetal" "string texturename" [""]
Sphere 1 -1 1 360
AttributeEnd
AttributeBegin
Translate 3 0 0
Color [1 1 0]
Surface "plastic"
Sphere 0.8 -1 1 360
AttributeEnd
AttributeBegin
Attribute "identifier" "name" ["kyu2"]
Translate 0 0 3
Color [0.9 0.7 0.4]
Surface "shinymetal" "string texturename" [""]
Sphere 1 -1 1 360
AttributeEnd
AttributeBegin
Translate 0 0 0
Surface "plastic"
Color [0 0 1] #blue
Cylinder 0.1 -100 100 360 # Z axis
Color [0 1 0] #green
Rotate 90 1 0 0
Cylinder 0.1 -100 100 360 # Y axis
Color [1 0 0] #red
Rotate 90 0 1 0
Cylinder 0.1 -100 100 360 # X axis
AttributeEnd
AttributeBegin
Color [1 1 1]
Translate 0 -1.5 0
Scale 5 5 5
Surface "matte"
Polygon "P" [-4 0 -4 -4 0 4 4 0 4 4 0 -4] "st" [0 0 0 1 1 1 1 0]
AttributeEnd
WorldEnd
試してみたInstruction File
Option "envmapfov" 92
Objects
{
ForNames "kyu1"
{
MapFormat 512 512
MapSamples 4 4
MapFilter "gaussian" 2 2
EnvMap [0.666667 0.333333 -0.666667 ] "surface" "texturename"
}
}
Objects
{
ForNames "kyu2"
{
MapFormat 512 512
MapSamples 4 4
MapFilter "gaussian" 2 2
EnvMap [0.666667 0.333333 2.333333 ] "surface" "texturename"
}
}
Lights
{
ForShaders "light" "pointlight"
{
MapFormat 1024 1024
RenameShader "light" "shadowpoint"
AppendParam "light" "width" [16] "uniform float" //introduce a bit of softness
AppendParam "light" "samples" [256] "uniform float"
ShadowPoint "sfnx" "sfpx" "sfny" "sfpy" "sfnz" "sfpz"
}
}
RenderManくりかえしくりかえし、勉強ですね。ありがとうございます。
上の画像はきれいに出力するために
PixelSamples 4 4
ShadingRate 0.25
を付け加えた。感謝しています。
環境マップ生成の際の中心位置はそれぞれ少しずらしている。
EnvMap [0.666667 0.333333 -0.666667 ]
以前の記事で書いた
python cgkitを使って
単位ベクトルを求めいる。
>>> from cgkit.all import *
>>> v=vec3(-10,-5,10)
>>> v.normalize()
(-0.666667, -0.333333, 0.666667)
符号は逆にした。
EnvMap [0.666667 0.333333 2.333333 ]
こちらは(0 0 3)に(0.666667 0.333333 -0.666667)を加えた。
AutoRIB その5
AutoRIBは、RenderManのRIBファイルに、環境マップとシャドーマップを自動生成してくれる便利ツールです。
RibFilterでやってみたRIBも、さくっと変換してくれました。
以下はInstruction File
Option "envmapfov" 92
GlobalRIB //this RIB will be added before the first frame
{
PixelSamples 4 4
ShadingRate 0.25
}
Objects
{
ForNames "_EV_n1_s1.0"
{
MapFormat 512 512
MapSamples 4 4
MapFilter "gaussian" 2 2
EnvMap [0 1 0 ] "surface" "texturename"
}
}
Lights
{
ForShaders "light" "pointlight"
{
MapFormat 1024 1024
RenameShader "light" "shadowpoint"
AppendParam "light" "width" [16] "uniform float"
AppendParam "light" "samples" [256] "uniform float"
ShadowPoint "sfnx" "sfpx" "sfny" "sfpy" "sfnz" "sfpz"
}
}
いろいろとできてくると楽しくなります。RenderManありがとうございます。
AutoRIB その6
RenderManにおいて、カメラ位置視点
placecam 0 2 -10 0 1 0から見た反射マップを生成するために
まず、cgkitで計算
>>> from cgkit.all import *
>>> v=vec3(0,2,-10)-vec3(0,1,0)
>>> v
(0, 1, -10)
>>> v.normalize()
(0, 0.0995037, -0.995037)
>>> _+vec3(0,1,0)
(0, 1.0995, -0.995037)
AutoRIBのInstruction Fileを書き換え、ちょっとずらしてみた。
EnvMap [0 1.0995 -0.995037 ] "surface" "texturename"
前回の記事の画像よりはきちんと映り込んでいます。
RenderManまだまだ勉強です。ありがとうございます。
AutoRIB その7
AutoRIBには、RenderManの技術の一つサブディビジョンサーフィスのSubdivisionMesh "catmull-clark"に変換してくれる機能がある。
Instruction Fileに一言
Objects {
ForNames "uma" {
ToSubdivision
}
}
と、記入しておけばよい。
基本Polygon "P"は変換できない。PointsPolygonに変換しておかなければならない。今回は、Meatasequoia PythonでRIB出力変換するツールで出してみた。
PointsPolygonを含み、各モデルにシェーダを割り当て、distantlightを入れておく、普通にprmanでレンダリングするとこんな感じになる。
次に以下のファイルを使ってAutoRIBで変換する。
>
//Tests ToSubdivision instruction
Objects {
ForNames "uma" {
ToSubdivision
}
}
Objects
{
ForNames "uma"
{
//Omit "mirror"
MapSamples 3 3
MapFilter "gaussian" 2 2
MapFormat 256 256
EnvMapAuto "surface" "texturename"
}
}
Lights
{
ForShaders "light" "distantlight"
{
MapFormat 1024 1024
RenameShader "light" "shadowdistant"
//AppendParam "light" "blur" [ 0.005 ] "uniform float" //introduce a bit of softness
ShadowDistAuto "shadowname" 1
}
}
RenderManでレンダリングした。空の代わりに球体をつくりTexturing & Moderingで有名なシェーダDPCloudplaneをつけた。
いろいろとやってみると面白いですね。レイトレーシングを使わなくてもここまできれいにできるとうれしいです。
何より計算速いです。ありがとうございます。
AutoRIB その8
shadowdistantを含む、RenderMan RIB出力する際、
AutoRIBエラー表示でわかったこと。
java.lang.NullPointerException
java.lang.NullPointerException
at org.pqt.autorib.instr.InstrShadowDistAuto.process(InstrShadowDistAuto.java:81)
at org.pqt.autorib.instr.InstrBlockRequest.process(InstrBlockRequest.java:92)
at org.pqt.autorib.instr.InstrBlockRequest.process(InstrBlockRequest.java:92)
at org.pqt.autorib.instr.InstrWReader.process(InstrWReader.java:710)
at org.pqt.autorib.ProcessRIB.doProcessRIB(ProcessRIB.java:365)
at org.pqt.autorib.AutoRIBmain.main(AutoRIBmain.java:351)
RenderMan RIBに
Format 640 480 1
を記述していないと自動的にShadowDistAutoが働かないようです。
ひとつひとつ確認ですね。ありがとうございます。
AutoRIB その9 RenderMan RIB調整
RenderManのRIBファイルをAutoRIBで読み込んでエラーが出ないように
RIBファイルを調整しておく必要がある。
Colorは [1 1 1]と[ ]をつけておくこと。
"uniform float fov"は"fov"にすること。
Geometry "teapot"は使えないので、
ReadArchive "teapot.rib"を使います。
Formatは書き込んでおくこと。
<< 11/15 >>