Rendering学習日記

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

Standard Procedural Databasesのmakefile

Standard Procedural Databases のNeutral File Format (NFF) を出力するために、MinGW gccでオプション設定しなおし、ちょっとだけmakefileを理解できました。Windows用の、makefile.dos
です。

mingw32-make -f makefile.dos
でコンパイル、リンクします。

makefile.dos


# Makefile for the SPD stuff - generic for IBM clones,
# modify to support whatever compiler you have.
CC =gcc
#
CFLAGS2 =-o
CFLAGS =-O2
EXE = exe
OBJ = o

# DOS version:
#SPDOBJS = drv_ibm.$(OBJ) libini.$(OBJ) libinf.$(OBJ) libpr1.$(OBJ) libpr2.$(OBJ) libpr3.$(OBJ) libply.$(OBJ) libdmp.$(OBJ) libvec.$(OBJ) libtx.$(OBJ)
# other versions...
SPDOBJS = drv_null.$(OBJ) libini.$(OBJ) libinf.$(OBJ) libpr1.$(OBJ) libpr2.$(OBJ) libpr3.$(OBJ) libply.$(OBJ) libdmp.$(OBJ) libvec.$(OBJ) libtx.$(OBJ)

# Zortech specific graphics library
#LIBFILES=fg.lib
#LIBFILES=fgp.lib
LIBFILES=-lm

all: balls.$(EXE) gears.$(EXE) mount.$(EXE) rings.$(EXE) teapot.$(EXE) \
tetra.$(EXE) tree.$(EXE) \
readdxf.$(EXE) readnff.$(EXE) readobj.$(EXE) \
sample.$(EXE) lattice.$(EXE) shells.$(EXE) jacks.$(EXE) \
sombrero.$(EXE) nurbtst.$(EXE)

# Rule to compile c progs into obj's
.c.$(OBJ):
$(CC) $(CFLAGS) -c $<

# DOS only
#drv_ibm.$(OBJ): drv_ibm.c drv.h def.h

drv_null.$(OBJ): drv_null.c drv.h def.h

libini.$(OBJ): libini.c lib.h libvec.h drv.h

libinf.$(OBJ): libinf.c lib.h libvec.h drv.h

libpr1.$(OBJ): libpr1.c lib.h libvec.h drv.h

libpr2.$(OBJ): libpr2.c lib.h libvec.h drv.h

libpr3.$(OBJ): libpr3.c lib.h libvec.h drv.h

libply.$(OBJ): libply.c lib.h libvec.h drv.h

libdmp.$(OBJ): libdmp.c lib.h libvec.h drv.h

libvec.$(OBJ): libvec.c libvec.h

libtx.$(OBJ): libtx.c lib.h libvec.h drv.h

balls.$(EXE): balls.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) balls.$(EXE) balls.c $(SPDOBJS) $(LIBFILES)

gears.$(EXE): gears.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) gears.$(EXE) gears.c $(SPDOBJS) $(LIBFILES)

mount.$(EXE): mount.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) mount.$(EXE) mount.c $(SPDOBJS) $(LIBFILES)

rings.$(EXE): rings.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) rings.$(EXE) rings.c $(SPDOBJS) $(LIBFILES)

teapot.$(EXE): teapot.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) teapot.$(EXE) teapot.c $(SPDOBJS) $(LIBFILES)

tetra.$(EXE): tetra.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) tetra.$(EXE) tetra.c $(SPDOBJS) $(LIBFILES)

tree.$(EXE): tree.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) tree.$(EXE) tree.c $(SPDOBJS) $(LIBFILES)

readdxf.$(EXE): readdxf.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) readdxf.$(EXE) readdxf.c $(SPDOBJS) $(LIBFILES)

readnff.$(EXE): readnff.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) readnff.$(EXE) readnff.c $(SPDOBJS) $(LIBFILES)

readobj.$(EXE): readobj.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) readobj.$(EXE) readobj.c $(SPDOBJS) $(LIBFILES)

sample.$(EXE): sample.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) sample.$(EXE) sample.c $(SPDOBJS) $(LIBFILES)

lattice.$(EXE): lattice.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) lattice.$(EXE) lattice.c $(SPDOBJS) $(LIBFILES)

shells.$(EXE): shells.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) shells.$(EXE) shells.c $(SPDOBJS) $(LIBFILES)

jacks.$(EXE): jacks.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) jacks.$(EXE) jacks.c $(SPDOBJS) $(LIBFILES)

sombrero.$(EXE): sombrero.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) sombrero.$(EXE) sombrero.c $(SPDOBJS) $(LIBFILES)

nurbtst.$(EXE): nurbtst.$(OBJ) $(SPDOBJS)
$(CC) $(CFLAGS2) nurbtst.$(EXE) nurbtst.c $(SPDOBJS) $(LIBFILES)

RenderMan | - | -

STANDARD PROCEDURAL DATABASES

STANDARD PROCEDURAL DATABASES 
http://tog.acm.org/resources/SPD/
これの実行ファイルを作成するのに試してみました。

以下、Windowsでの作業です。

MinGWをインストールする。
最新バージョンはインストール時にmakeも含まれているようで楽かも。
環境パスも設定します。

さてさて、コンパイルの作業をします。
gccのオプションは以下を参考にしました。
http://www.geocities.jp/woodwood77777/gcc.htm
makefile.dosを以下、書き換え
CC =gcc

CFLAGS =-O2

以下を実行します。
mingw32-make -f makefile.dos


libinf.cの32行目あたりで
"initializer element is not constant" と出て止まったら
変更前 FILE *gOutfile = stdout;
変更後 FILE *gOutfile;

以下を実行します。
mingw32-make -f makefile.dos

mingw/lib/libmingw32.a(main.o):main.c.text+0x104): undefined
reference to `WinMain@16'
エラーメッセージ

このあたり、エラーがでますが、くりかえしてみる。
mingw32-make -f makefile.dos

ちょっとうろ覚え、
CFLAGS =-mx
と変更して
mingw32-make -f makefile.dos
をくりかえしてみる。

以上、コンパイルのみ実行してリンクは後で行う。

以下のようなバッチファイルを作ってしまう。
作成したオブジェクトファイルをリンクさせる。
gcc -o balls.exe balls.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm

以下はバッチファイル


gcc -o balls.exe balls.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o gears.exe gears.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o mount.exe mount.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o rings.exe rings.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o teapot.exe teapot.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o tetra.exe tetra.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o tree.exe tree.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o readdxf.exe readdxf.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o readnff.exe readnff.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o readobj.exe readobj.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o sample.exe sample.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o lattice.exe lattice.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o shells.exe shells.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o jacks.exe jacks.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o sombrero.exe sombrero.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm
gcc -o nurbtst.exe nurbtst.c drv_null.o libini.o libinf.o libpr1.o libpr2.o libpr3.o libply.o libdmp.o libvec.o libtx.o -lm



できあがった実行ファイルがいくつかあります。
balls.exe
gears.exe
jacks.exe
lattice.exe
mount.exe
nurbtst.exe
rings.exe
sample.exe
shells.exe
sombrero.exe
teapot.exe
tetra.exe
tree.exe

balls.exe >balls.nff
でnffを出力します。

後は、XRT rendererでレンダリングしました。
balls.nff
balls.jpg

lattice.nff
lattice.jpg

jacks.nff、これってケッソン先生のところで見たAOしてるブツのオリジナルになるのでしょうか。
jacks.jpg

いろいろと試してみたくなりました。
ありがとうございます。
RenderMan | - | -

XRT redererその2

checkerシェーダーを再コンパイル。立方体にはshinyを割り当てる。
box_checkjpg.JPG
レイトレーシングしています。


#box_check.pyg
Output ("box_check.tif", "tiff", "rgb", "camera", "float gain", 1, "float gamma",
1, "string filter", "gaussian", "float[2] filterwidth", (2, 2))
Attribute ("float shadingquality",1.2)
Attribute ("string projection", "perspective")
Attribute ("float fov", 20)
Attribute ("int[2] resolution", (640, 480))
#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)

#Attribute ( "int ray:shadows", 0 )
Attribute ("string geometryset", "+shadows")
Attribute ("string geometryset", "+reflection")

World ()
Light ("light1", "pointlight", "float intensity", 400, "point from", (-10, 10, -10),"string shadowname", "shadows")
Light ("light2", "pointlight", "float intensity", 400, "point from", (10, 10, -10),"string shadowname", "shadows")

PushTransform ()
Attribute ("color C", (0.2, 0.4, 0.75))
Sphere (100, -100, 100, 360)
PopTransform ()

for i in range(5):
PushTransform ()
Attribute ("color C", (1, 1, 1))
Shader ( "surface", "shiny", "float Kd", 0, "float Kr", 0.75, "float roughness", 0 )
#Shader ("surface", "plastic")
i=1.2*i
Translate ( 0, 0.5, i-2)
Input ("BoxGeom.rib")
PopTransform ()


Attribute ("color C", (1, 1, 1))
Rotate (90.00, 1.00, 0.00, 0.00)
ShaderGroupBegin ()
Shader ("surface", "checker","float frequency",10,"color blackcolor",(0, 0, 0))
#Shader ("surface", "plastic", "layer2")
#ConnectShaders ("layer1", "Cout", "layer2", "C")
ShaderGroupEnd ()
Input("PlaneGeom.rib")
Render()


ありがとうございます。さらに勉強します。
RenderMan | - | -

XRT Renderer

Structure Synthについて検索していたら、
レイトレーシング・レンダラのXRT Rendererを見つけた。
ダウンロードサイトはこちら
http://xrt.wikidot.com/
Windows Only
インストールに必要なものは、解凍ソフトの7-zip
解凍したら、C:\xrt1.0を環境変数のPathに追加しておく。
次に、Microsoft Visual Studio 10.0 Visual C++ Expressをダウンロードし、インストールしてしまう。
xrt1.0フォルダにある。xrt.bat内の最後の行を以下に書き換える。
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"\vcvars32.bat

Python2.6.6をインストールしておく。Python2.5との共存はちょっとわからないので、2.5はアンインストールした。

XRT rendererのサイトからexampleもダウンロードしてxrt1.0フォルダに入れておく。

さて、実行方法は、コマンドプロンプトから、
C:\xrt1.0>xrt.bat
C:\xrt1.0>set RENDERER=xrt
C:\xrt1.0>set COMPILER=slc
C:\xrt1.0>set TEXER=maketx
C:\xrt1.0>set LIB=;C:\xrt1.0\\lib
C:\xrt1.0>set LIBRI=libri
C:\xrt1.0>set INCLUDE=;C:\xrt1.0\\include
C:\xrt1.0>set COMPILEEXT=shader.dll
C:\xrt1.0>set IMAGEEXT=png
C:\xrt1.0>call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin"\vcva
rs32.bat
Setting environment for using Microsoft Visual Studio 2010 x86 tools.

続いてexampleフォルダに行き、
C:\xrt1.0\examples\quadrics>make.bat compile
metal01.cpp
ライブラリ .\metal01.shader.lib とオブジェクト .\metal01.shader.exp を作成中
コード生成しています。
コード生成が終了しました。
.\metal01.shader.dll generated !
シェーダを再コンパイルします。
レンダリングは、
C:\xrt1.0\examples\quadrics>make.bat render
フォルダ内のRIBはすべてレンダリングします。
make.bat cleanでフォルダ内の中間ファイルやレンダリング画像を削除してくれます。要は全部バッチファイル内に記述されています。

nVidia GelatoのPygファイルは、QuadroFXなどのカードがなくても、
XRT Rendererがレンダリングしてくれます。
RenderMan RIBでは、Aqsis,BMRT,jrManのサンプルファイルをレンダリングします。
そのほか、Standard Procedural Databases のNeutral File Format (NFF) もレンダリングします。

あと、Structure Synthでつくったモデルをpygで出力するエクスポータが付属しています。Structure Synthのmiscフォルダに入れておくとよいですが、Lookatモジュールが見当たらないということで、動いていません。
要検討です。

簡単なpygファイルもレンダリングしました。
spotlightシェーダも影を出すスクリプトをコンパイルしてからレンダリングしたら、きちんと影がでます。
今のところレンダリングは遅いです。マルチスレッド対応してません。
今後に期待したいところです。
シーン記述言語を学ぶ学習ツールとしてはまったりと最適かな、と思います。
ありがとうございます。
RenderMan | - | -

Structure Synth

オープンソースのStructure SynthからRenderMan RIBを出せるようにちょっとやってみた。
http://structuresynth.sourceforge.net/

市松模様づくり参考に試してみました。
http://kyle-in-jp.blogspot.com/2009/07/structure-synth_10.html
RenderMan RIBも出力できるようにテンプレート調整してみた。
structuresynth_.jpg

こちらの記事も参考にしてみた。
http://shin-ishimaru.cocolog-nifty.com/blog/2009/03/structure-syn-1.html
structuresynth2.jpg
地面のレンダリングがずれてしまうので、RIBのTransformをいじってみた。

デフォルトのデータは、こんな感じ
structuresynth.jpg

ということで、カメラ周りは逆行列をもとめないといけないので、
無理矢理cgkitでConcatTransformを出してみました。
以下は、テンプレート抜粋


#placecam.py {CamPosX} {CamPosY} {CamPosZ} {CamTargetX} {CamTargetY} {CamTargetZ}
#up {CamUpX} {CamUpY} {CamUpZ}
# cgkit commandline
# V=mat4(1).lookAt(pos=({CamPosX}, {CamPosY}, {CamPosZ}),target=({CamTargetX}, {CamTargetY}, {CamTargetZ}),up=({CamUpX}, {CamUpY}, {CamUpZ}))
# vt=(V.inverse()).transpose()
# fov {fov}
Scale -1 1 1
ConcatTransform [{CamColumnMatrix}]



ConcatTransform [{CamColumnMatrix}]部分は逆行列にしないとダメなんで、cgkitで
from cgkit.all import *
V=mat4(1).lookAt(pos=(7.83552, 12.4411, 18.2554),target=(7.92488, -46.149, -34.0976),up=(-0.170831, 0.656364, -0.734849))
vt=V.inverse()

print "ConcatTransform ["+str(vt[0][0])+" "+str(vt[0][1])+" "+str(vt[0][2])+" "+str(vt[0][3])+" "
print str(vt[1][0])+" "+str(vt[1][1])+" "+str(vt[1][2])+" "+str(vt[1][3])+" "
print str(vt[2][0])+" "+str(vt[2][1])+" "+str(vt[2][2])+" "+str(vt[2][3])+" "
print str(vt[3][0])+" "+str(vt[3][1])+" "+str(vt[3][2])+" "+str(vt[3][3])+" ]
求めてみた。
RenderMan | - | -
1/1