Rendering学習日記

日々3DCGの世界は進歩しているけど、勉強して理解したことをまとめていきたい。RenderMan互換レンダラーやグローバル・イルミネーション。いろんなことに好奇心を持ち面白くなってくる。目指せShader書き!!

Processing(プロセッシング)からSunflowへ

ビジュアルデザイン用プログラミング言語Processing(プロセッシング)からSunflowへつなげるライブラリとしてP5Sunflow(http://hipstersinc.com/p5sunflow/)があるが、Processing1.2.1や1.5.1には対応していなかった。
新たに検索したら、
joons-renderer Brings Sunflow's ray-tracing to Processingがあった。
http://code.google.com/p/joons-renderer/

インストールは、
joons_070.zipを解凍する。
解凍したjoonsフォルダごと
Processing1.5.1の以下の場所へコピーする。
C:\processing-1.5.1\modes\java\libraries


Processingを起動し、メニュー「Sketch」→「Import Library...」→joonsが入っていればインストール完了です。

以下のスクリプトをProcessingにコピペします。

Save Asで保存します。
ここではtest01と名付けたとします。


import joons.*;

JoonsRenderer jr;
boolean rendered = false;

float eyeX = 50;
float eyeY = 90;
float eyeZ = 50;
float centerX = 0;
float centerY = 0;
float centerZ = 0;
float upX = 0;
float upY = 0;
float upZ = -1;
float fov = PI / 4;
float aspect = (float) 1.3333;
float zNear = 5;
float zFar = 10000;

public void setup() {
size(640, 480, P3D);
jr = new JoonsRenderer(this,width,height);
jr.addAfterShader("shader {");
jr.addAfterShader(" name Green");
jr.addAfterShader(" type shiny");
jr.addAfterShader(" diff 0.25 0.8 0.25");
jr.addAfterShader(" refl 0.25");
jr.addAfterShader("}");
jr.addAfterShader("shader {");
jr.addAfterShader(" name blueshiny");
jr.addAfterShader(" type shiny");
jr.addAfterShader(" diff 0.2 0.4 0.75");
jr.addAfterShader(" refl 0.25");
jr.addAfterShader("}");
}

public void draw() {
background(128);
lights();
fill(255);

beginRecord("joons.OBJWriter","");//leave the second parameter as "".

perspective(fov, aspect, zNear, zFar);//use perspective() before camera()!!
camera(eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);

rect(-500,-500,1000,1000);//the floor plane

noSmooth(); //In my library, noSmooth() is used to separate one object from another.

translate(0,-20,20);
rotateX((float) 0.3);
rotateY((float) 0.2);
rotateZ((float) 0.1);

translate(10,0);
sphere(10);
translate(10,0);
sphere(10);
translate(10,0);
sphere(10);
translate(10,0);
sphere(10);
translate(-40,30);
rotateZ((float)1.5);
rotateX((float) 0.8);
box(20);

endRecord();

if(rendered)
jr.display();
}

public void keyPressed() {
if (key == 'r' || key == 'R' && !rendered) {
saveFrame("capture.png");
jr.setShader("sphere0","Green");
jr.setShader("sphere1","blueshiny");
jr.setShader("sphere2","Green");
jr.setShader("sphere3","blueshiny");
jr.setShader("object1","Red");
jr.setSC("ambient.sc");
rendered=jr.render("bucket");
}
}

Sunflowのscシーンファイルambient.scをjoonsのダウンロードサイトからコピーしておきます。

ambient.scをマイドキュメントフォルダのprocessingフォルダのtest01フォルダに移動させます。

実行ボタンを押すと、スケッチが出ます。
capture.jpg
続いてキーボードからrキーを押すとレンダリングされます。
renderWIP.jpg
noSmooth(); がオブジェクトを分離します。Sphereは別です。
いろいろといじってみます。ありがとうございます。
Sunflow | - | -

Sunflow mix.shader

Structure SynthからSunflowシーンを出力し、エディタでIBL設定、あらかじめテンプレートでmix.shaderを割り当てる。

基本のmix.shaderの設定
janio1.jpg

Structure Synthのball.esを設定
janio2.jpg

カメラを寄せて出力
janio3.jpg
Sunflow | - | -

topmodからSunflow

topmodの使い方があったので、参考にする。
MUZU fractal
http://muzumuzu.wordpress.com/2010/07/18/
blender-と-topmod-が初めてでも、とにかく結果を得たいぞ
http://muzumuzu.wordpress.com/2010/07/22/
blender-と-topmod-が初めてでも、とにかく結果を得たいぞ(その2)
http://muzumuzu.wordpress.com/2010/07/26/
blender-と-topmod-が初めてでも、とにかく結果を得たいぞ(その3)

Video Tutorial – “MoebiusTori – Interlocked” in TopMod 2
http://blip.tv/file/405564/

TopmodはPython2.5版を利用した。deleteキーがこちらでないと作動しないような。上のビデオをみて作成し、objで出力し、metasequoiaに読み込む。
建物を作り、内部に入れる。metasequoia pythonでSunflowシーンを出力した。
topmod0.jpg

IBLを設定する。
topmod2.jpg

AOを暗めにいれる。
topmod3.jpg

mix.shaderを使ってみる。レンダリング時間が長くなってしまった。
topmod5.jpg
Sunflow | - | -

Structure SynthからSunflow その2

Structure Synthで、地面を入れてみる。
ball.esを呼び出し、以下を追加してBuild。

{s 300 20 300 y -1 hue 200 sat 0 b 0.95}box

地面ができるので、カメラ位置を決める。
Sunflowテンプレートを呼び出してscを出力し、レンダリングした。
ball.jpg

シン石丸の電脳芸事ニッキのテンプレートsunflowmulticolored_ibl.rendertemplate
をちょっと書き換える。
substitutionは、primitiveに書き換え。
defaultExtension="Sunflow scene file (*.sc)"
を書き入れる。Sunflowでの出力は以下のようになった。
ありがとうございます。
ball2.jpg
Sunflow | - | -

Structure SynthからSunflowへ

Structure SynthからSunflowへエクスポートできます、いくつかの設定があります。カメラの向きがいまひとつ気に入らないので、objで出力し、メタセコイアに読み込む。metasequoia pythonで作成したエクスポータを使ってsunflowのフォーマットの三角ポリゴンを出力しました。
地面などは、エディタで追加。面白いですね。
frameby.jpg
Sunflow | - | -

Sunflow IBLその2

SunflowでのHDRI画像取り扱いとして、魚眼レンズのように円形に収まっている画像イメージは不向き。球体での映り込みは、北極部分が黒くなってしまう。四角いままが良いようです。
ibltest2.jpg


image {
resolution 640 480
aa 1 1
samples 4
filter gaussian
}

gi {
type ambocc
bright { "sRGB nonlinear" 0.8 0.8 0.8 }
dark { "sRGB nonlinear" 0 0 0 }
samples 32
maxdist 3.0
}

%%shader

shader {
name "Yellow"
type diffuse
diff 1 1 0
}

shader {
name "Magenta"
type diffuse
diff 1 0 1
}

shader {
name sfshi.shader
type shiny
diff { "sRGB nonlinear" 0.800 0.800 0.800 }
refl 0.5
}

shader {
name sfmir.shader
type mirror
refl { "sRGB nonlinear" 0.800 0.800 0.800 }
}

shader {
name floor
type diffuse
diff 0.9 0.9 0.9
}


%% camera

camera {
type pinhole
eye 3 -20 5
target 0 0 0
up 0 0 1
fov 25
aspect 1.3333
}


%% light sources

light {
type point
color { "sRGB nonlinear" 1.000 1.000 1.000 }
power 1500.0
p -3 -10 10
}

light {
type ibl
image hdr017.hdr
center 0 -1 0
up 0 0 1
lock true
samples 200
}


%% geometry
object {
shader floor
type plane
p 0 0 -1.0
n 0 0 1
}


object {
shader "Yellow"
type sphere
name sp1
c 0 0 0
r 1.0
}

instance {
name nameOfInstance
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate -2 0 0
}
shader sfshi.shader
}

instance {
name nameOfInstance2
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate -4 0 0
}
shader sfshi.shader
}

instance {
name nameOfInstance3
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate 2 0 0
}
shader sfshi.shader
}

instance {
name nameOfInstance4
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate 4 0 0
}
shader sfshi.shader
}

instance {
name nameOfInstance5
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate -2 8 0
}
shader sfmir.shader
}

instance {
name nameOfInstance6
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate -4 8 0
}
shader sfmir.shader
}

instance {
name nameOfInstance7
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate 2 8 0
}
shader sfmir.shader
}

instance {
name nameOfInstance8
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate 4 8 0
}
shader sfmir.shader
}

Sunflow | - | -

Sunflow オブジェクト・インスタンス

シーンを変更して保存した後、guiのBuild Sceneボタンを押してからレンダリングすると反映されますね。

オブジェクトのインスタンスはできますが、
グループ化できないのでしょうか?

一歩一歩ですね。

instance.jpg


image {
resolution 640 480
aa 1 1
samples 4
filter gaussian
}

gi {
type ambocc
bright { "sRGB nonlinear" 0.8 0.8 0.8 }
dark { "sRGB nonlinear" 0 0 0 }
samples 32
maxdist 3.0
}

%%shader

shader {
name "Yellow"
type diffuse
diff 1 1 0
}

shader {
name "Magenta"
type diffuse
diff 1 0 1
}

shader {
name sfshi.shader
type shiny
diff { "sRGB nonlinear" 0.800 0.800 0.800 }
refl 0.5
}

shader {
name floor
type diffuse
diff 0.9 0.9 0.9
}


%% camera

camera {
type pinhole
eye 3 -20 5
target 0 0 0
up 0 0 1
fov 25
aspect 1.3333
}


%% light sources

light {
type point
color { "sRGB nonlinear" 1.000 1.000 1.000 }
power 1500.0
p -3 -10 10
}


%% geometry
object {
shader floor
type plane
p 0 0 -1.75
n 0 0 1
}


object {
shader "Yellow"
type sphere
name sp1
c -1 0 0
r 1.75
}

object {
shader "Magenta"
type sphere
name sp2
c 1 0 0
r 1.75
}

instance {
name nameOfInstance
geometry sp1
transform {
rotatex 0
scaleu 1.0
translate -1.75 -4 -0.5
}
shader sfshi.shader
}

instance {
name nameOfInstance2
geometry sp2
transform {
rotatex 0
scaleu 1.0
translate -0.75 -4 -0.5
}
shader sfshi.shader
}

Sunflow | - | -

Sunflow IBL

Sunflow試してみた。HDRIはhttp://ict.debevec.org/~debevec/Probes/から。
ibltest.jpg

シーン記述Sunflow v0.07.3で動きます。


image {
resolution 640 480
aa 1 1
samples 4
filter gaussian
}

%%shader

shader {
name "Yellow"
type diffuse
diff 1 1 0
}

shader {
name "shader09"
type glass
eta 1.4
color 1 1 1
}

shader {
name "shader08"
type glass
eta 2.4
color 1 1 1
}

shader {
name "Xaxis"
type diffuse
diff 1 0 0
}

shader {
name "Yaxis"
type diffuse
diff 0 1 0
}

shader {
name "Zaxis"
type diffuse
diff 0 0 1
}

shader {
name floor
type diffuse
texture "check_red10.jpg"
}

shader {
name XZ
type diffuse
texture "check_b10.jpg"
}

modifier {
name perlinName
type perlin
function 1
size 1
scale 3.5
}


%% camera

camera {
type pinhole
eye 3 -20 5
target 0 0 0
up 0 0 1
fov 25
aspect 1.3333
}


%% light sources

light {
type point
color { "sRGB nonlinear" 1.000 1.000 1.000 }
power 1500.0
p -3 -10 10
}

light {
type ibl
image galileo_probe.hdr
center 0 -1 0
up 0 0 1
lock true
samples 200
}

%% geometry

object {
shader "shader09"
/* modifier perlinName */
type sphere
name "sp1"
c 0 0 0
r 1.4
}


instance {
name nameOfInstance0
geometry "sp1"
transform {
rotatex 0
scaleu 1.0
translate 2.5 0 0
}
shader "shader08"
}

object {
shader "Xaxis"
transform {
rotatex 0
scaleu 0.2
scale 1 1 30
rotatey 90
translate 0 0 0
}
type cylinder
name Xjiku
}


object {
shader "Yaxis"
transform {
rotatex 90
scaleu 0.2
scale 1 50 1
rotatey 90
translate 0 0 0
}
type cylinder
name Yjiku
}


object {
shader "Zaxis"
transform {
scaleu 0.2
scale 1 1 30
translate 0 0 0
}
type cylinder
name Zjiku
}

object {
shader "floor"
transform {
translate 0 0 -1.5
}
type generic-mesh
name "floormesh"
points 4

-10.0 -10.0 0
10.0 -10.0 0
-10.0 10.0 0
10.0 10.0 0
triangles 2
1 3 2 1 2 0
normals vertex
0.0 0.0 1.0
0.0 0.0 1.0
0.0 0.0 1.0
0.0 0.0 1.0
uvs facevarying
1.0 0.0
1.0 1.0
0.0 1.0
1.0 0.0
0.0 1.0
0.0 0.0
}

instance {
name nameOfInstance
geometry "floormesh"
transform {
rotatex 90
scaleu 1.0
translate 0 3 0
}
shader XZ
}

Sunflow | - | -

Sunflow いろいろ試してみる

Sunflow v0.07.3でcylinder使える。coneはないのでメタセコから三角poly出力してみる。以下AO設定、perlin noiseのbumpを付けてみた。
perlin.jpg
コンパイルされたSunflow v0.07.3はこちら。
http://www.polyquark.com/opensource/



image {
resolution 640 480
aa 1 1
samples 4
filter gaussian
}

gi {
type ambocc
bright { "sRGB nonlinear" 0.8 0.8 0.8 }
dark { "sRGB nonlinear" 0 0 0 }
samples 32
maxdist 3.0
}

%%shader

shader {
name "Yellow"
type diffuse
diff 1 1 0
}

shader {
name "Xaxis"
type diffuse
diff 1 0 0
}

shader {
name "Yaxis"
type diffuse
diff 0 1 0
}

shader {
name "Zaxis"
type diffuse
diff 0 0 1
}

shader {
name floor
type diffuse
diff 0.9 0.9 0.9
}

shader {
name XZ
type diffuse
diff 0.2 0.4 0.6
}

modifier {
name perlinName
type perlin
function 1
size 1
scale 3.5
}


%% camera

camera {
type pinhole
eye 3 -20 5
target 0 0 0
up 0 0 1
fov 25
aspect 1.3333
}


%% light sources
/*
light {
type sunsky
up 0 0 1
east 0 1 0
sundir -3 -10 10
turbidity 6
samples 128
}
*/

light {
type point
color { "sRGB nonlinear" 1.000 1.000 1.000 }
power 1500.0
p -3 -10 10
}


%% geometry
object {
shader floor
type plane
p 0 0 -3
n 0 0 1
}

object {
shader XZ
type plane
p 0 6 0
n 0 1 0
}


object {
shader "Yellow"
modifier perlinName
type sphere
name "sp1"
c 0 0 0
r 1.2
}

instance {
name nameOfInstance
geometry "sp1"
transform {
rotatex 0
scaleu 1.0
translate 2.5 0 0
}
shader floor
modifier perlinName
}



object {
shader "Xaxis"
transform {
rotatex 0
scaleu 0.2
scale 1 1 30
rotatey 90
translate 0 0 0
}
type cylinder
name Xjiku
}


object {
shader "Yaxis"
transform {
rotatex 90
scaleu 0.2
scale 1 50 1
rotatey 90
translate 0 0 0
}
type cylinder
name Yjiku
}


object {
shader "Zaxis"
transform {
scaleu 0.2
scale 1 1 30
translate 0 0 0
}
type cylinder
name Zjiku
}

Sunflow | - | -

Sunflowのcaustics

サンプルexampleフォルダ内のshader_examplesにあるGlass001.scのcausticsの設定は、そのままではうまく出なかった。
下記のように設定を変更した。kdを大きくし、GUIのログを見てradiusを変更した。

photons {
caustics 10000000 kd 10000 0.5
}

glass.jpg
Sunflow | - | -
1/1