第1節 イントロダクション

VirtuaLightインタフェースはレンダラに3Dシーンの記述を転送するための手続きの集合です。
このインタフェースは記述言語であると考えることができます。
それはスクリプトベースで、大文字小文字の違いを識別しASCII ファイルをセーブすることが可能などのようなテキストエディタででも書くことが可能です。
VirtuaLightレンダラはこの入力を受け取り、イメージあるいはシーケンスのイメージを作成します。
出力イメージはカラー情報はもちろんのこと、ポスト処理のための補償情報をも含んでいます。

シーンの幾何学的な記述を持つメインの入力ファイルは拡張子.VIB (VirtuaLight Interface Bytestream) でなければなりません。
そのシーンのための、シェ−ダとサーフェイスの記述を含む入力ファイルはシーンと同じ名前のファイルで、拡張子は.VS (VirtuaLight Shader) でなければなりません。
VIBの入力はシェ−ダの記述を含んでいるかも知れませんが、明快さと構成的な理由のため、常に適切なVSファイルにシェーダの記述をするべきです。

VirtuaLight内部では全てが動的に割り当てられる為、幾何学図形プリミティブの数やシェーダの数の両方とも、入力ファイル (VIB 又は VS) の大きさに制限がありません。
唯一の制限はプラットフォーム上で利用可能なメモリの量になります。

現在、VirtuaLightインターフェイスは、RGB (Red,Greem,Blue) あるいはRGBA (Red,Green,Blue,Alpha) の色空間のみをサポートします。しかしHSVColcoWheel手続きはHSV (Hue,Saturation,Value-色合い、飽和、値) Wheelから色を選択することを可能にします。





第2節 プロトコル

2.1 文法の基礎と構文規則

他の構造化された言語のように、VirtuaLightインターフェイスは主要な規則を持っています。これらの規則に従わない場合、解析中エラー (ステージ解析中) または評価エラー (ステージレンダリング中) の原因になり、処理は中断されます。

ステージ解析段階では、プログラムはすべてのトークンをチェックし、指定された値でシーンを作成します。
このレベルでは、与えられた指示による計算式の結果が正しいかどうか知る事は不可能です。
構文解析は、用語が間違った使い方をされているかあるいは誤った値が与えられている場合に、それを検出します。

ステージレンダリング段階ではプログラムは、サーフェイスについて各々の光源の光線交差の、全ての計算式を評価します。
もし得られた結果が範囲から外れている場合や一貫しない時あるいは相容れない時は、評価エラー (evaluation error) が出力され、レンダリング処理は終了します。

VirtuaLight インタフェース構文は次の規則に基づいています。


エンティティー (Entities)

"Declare" , "static" あるいは "new" リクエストにより定義可能なものを現す一般的な用法です。


式 (Expressions)

式は、基本的に数学的にあるいは論理記号あるいは関数の意味のある組み合わせです。
式のいくつかのタイプ (数値、ベクトル、条件式、値の定義、配列) はここで使用可能です。

float 式で使用されるオペレータは以下の通り

expr + expr 加算-Addition
expr - expr 減算-Subtraction
expr * expr 乗算-Multiplication
expr / expr 除算-Division
expr ^ expr 指数-Exponentiation (also available with function pow(x, y))
(expr)      括弧-Parenthesized
-expr       マイナス-Negation
|expr|      絶対値-Absolute value (also available with function fabs(expr))

ベクトル式で使用されるオペレータは以下の通り(v1 , v2 がベクトルの時)

v1 + v2    ベクトル加算-Addition
v1 - v2    ベクトル減算-Subtraction
v1 * v2    ベクトル外積-Cross product
v1 . v2    ベクトル内積-Dot product (return a float)
v1 ^ v2    ベクトル外積-Exterior product (v1[X]*v2[X], v1[Y]*v2[Y], v1[Z]*v2[Z])
v1 * float スカラによるベクトルスケーリング-Scaling of a verctor by a scalar
v1 / float スカラによるベクトル逆スケーリング -Inverse scalling of a vector by scalar
|v1|       ベクトルの長さ (return a float)(also available function of lengtn(v1))
v1[X]      X成分抽出-Extract value of component x (return a float)
v1[Y]      Y成分抽出-Extract value of component y (return a float)
v1[Z]      Z成分抽出-Extract value of component z (return a float)


値 (Values)

式から得られる結果を定義するものはvalue(値)と呼ばれます。


点とベクトル (Points and Vector)

点とベクトルは  (x,y,z) と記述されます。各構成要素は正または負、浮動小数点、整数または式があり得ます。
点またはベクトルの構成要素にアクセスするためのシンタックスは、X要素には vector[0]、Y要素には vector[1]、そしてZ要素には vector[2]です。 (もしアーカイブ "statics.vib" が入力ファイルの先頭に include されている場合、vector[X]、vector[Y]、vector[Z]の記述もまた正解です)

e.g. (10, -50, 75)
e.g. (-2.2, cos(A*PI/180), 4*z)


色 (Colors)

色は 'r,g,b' または 'r,g,b,a' と記述されます。
'a' が指定されている場合 'a' は色の不透明値 (アルファとして知られる )を表現しています。
それぞれの構成要素は、0.0と1.0の間の値でなければなりません。それは式の場合でも同様です。
色の構成要素にアクセスするためのシンタックスは、赤の要素には color[0]、緑の要素には color[1]、青の要素にはcolor[2]、アルファの要素には color[3]です。 (もしアーカイブ "statics.vib" が入力ファイルの先頭に include さている場合、color[R],color[G],color[B],color[A]の記述もまた正解です)

e.g. '0.5, 1.0, 0.5'
e.g. '1, 1.0-(D/CurrentFrame), D, 1.0-D'*0.5+D/2.0


配列 (Array)

配列は、便利なリスト形式でデータを表現する方法として定義されます。
それは基本的にインデックス値のまたは式のリストです。
配列は色の範囲で同じ様に使用されます。
ベクトルは、3つのインデックスの長さの内部配列としてよく考えられています。
VIB内部では、カギ括弧 "[" , "]" が配列の区切りになっています。
配列 (浮動小数点またはベクトル) の構成要素にアクセスするためのシンタックスは、最初の要素には array[0]、二番目の要素には array[1] etc. です。
配列内部のベクトルの構成要素にアクセスするためのシンタックスは、最初のベクトルのX要素には array[0][0] 、最初のベクトルのY要素には array[0][1] 、...n番目のベクトルのX要素には array[n][0]、etc.です。 (アーカイブ "statics.vib" が入力ファイルの先頭に include されている場合は0,1,2の替わりにX,Y,Zが指定可能です)


条件式(Conditionals)

条件式は2通りの方法で使用可能です。

-条件式機能の基本的な記述です。

(expression ? value_if_true : value_if_false)

"value_if_true/value_if_false" は浮動小数点あるいはベクトルの値のどちらでもあり得ます。
ネスト構造も可能です。(カッコを忘れないでください)

(expression ? ((expression ? if_true : if_false)) : ((expression ? if_true : if_false)))

これはC言語と同等のものが採用されています。それは他の式に基ずいて式を定義する単純な方法です。

-条件処理は2つの方法で記述されます。

if (expr)
    condition


もし式が真なら、レンダラは condition を処理します。

あるいは

if (expr)
    condition1
else
    condition2

もし式が真なら、レンダラは condition1 を処理します、それ以外は condition2 が処理されます。

もし複数行の文が条件にあるなら、"{" , "}" が必要ですが、1行の文の場合は必要ありません。

if (expr) {
    condition1
    ....
}
else {
    condition2
    ....
}


条件式は、アニメーションのシーケンスの制御や現在のフレームに関する属性の切り替えに非常に役立ちます。


関数 (Function)

関数は色、浮動小数点値やベクトル (分類によります) を返す内部手続きです。
関数は常にカッコを必要とし、小文字でなければなりません。(テクスチャマッピングのものとHSVColorWheel以外)
それらは少なくともひとつの引数と戻り値を持っていなければなりません。(randomを除く)
各引数は別の関数の戻り値を値とすることも可能です。
ひとつ以上の引数を必要とする関数のために、コンマ "," が引数の区切りとして使われます。
関数は、値を戻すのに適当な必要とする引数リストの、可能な限りの指示を使用することが可能です。


指令 (Directive)

指令はシーンの内容 (オブジェクト、光源、カメラ、サーフェイス、オプションなど) を記述するために使用されます。
それらのいくつかは (特にシェーダ構造の内部) 関数あるいは式を修飾するのに使われます。
指令はしばしば合成された語です。
それぞれの言葉の最初の文字は常に大文字です。

e.g. IrradianceDistribution, PhongSpecularBRDF, TriangularPatch.

文字列の定義 (Declare, static, new, let) と条件文字列 (if, else) は指令とはみなされません。
ひとつだけの引数を必要とする指令はカッコを使用しません、しかしその代わりにスペースによる分離が必要です。

e.g. ComputeIrradiance 16
e.g. FrameAspectRatio 16/9

ひとつ以上の引数を必要とする指令はカッコを必要とします。
コンマは常に引数の区切りになります。

e.g. Format(640,480)
e.g. Box( (-1,-1,-1), (1,1,1) )


構造体 (Structure)

構造体は最初に特有のパラメータと、時にオプションである他の指令あるいは構造体を含む特別な指令です。
構造体の内容は常に角カッコの間に記述されます。
コンマは、オプションや構造体内部で必要な指令を分離しません。

e.g. PointLight [ (0, -1, 2) Intensity '.9,.75,.9'*M Glow 0.1 ]

注意 (Notes)

すべての指令と関数は予約語です。
それらは、シェーダ、定数、変数、シェイプや他のいかなる宣言の名前として使用することは出来ません。
例えば、この種類の宣言は解析中エラーを引き起こさせるでしょう:

Declare Box = Shape [ Box ((-10, -0.5, -10), (10, 0, 10)) ]

なぜなら「Box」は予約語だからです。
しかしながら、これは正しい記述です:

Declare box = Shape [ box ((-10, -0.5, -10), (10, 0, 10)) ]

なぜなら構文解析は大文字小文字の違いを識別し、そしてワード「box」は予約語ではありません。
セクション2.4で記述したように、以下のラインを入力ファイルVSの先頭で include することは賢明なことです。

ReadArchive "statics.vib"

このVIBファイルは有用な定数の宣言を含むので、ユーザ自身の宣言ではこれらの名前を使用することを推奨しませんでした。


2.2 Comments

入力ファイルにはコメントを付加することが出来ます。
2通りの標準的なC言語形式のものが考慮されています。
複数行のコメントのシンタックスは:

/* There
are my
comment */

1行のコメントのシンタックスは:

// This is a comment

2重スラッシュが読み込まれるとすぐに、ラインの残りはコメントとみなされます。

VirtuaLight specific注意

入力ファイルの最終行にコメントを決して使用しないことを忘れないでください。
それは構文解析エラーの原因になります。


2.3 String classifications

シーンを記述する文字列は14の部門に分類できます。ここのリストはそれらのおのおのの全ての部門を分類しています。

注意
[] - 構造体を表す
() - 引数がひとつのみの指令を表す(シンボリック、関数の場合を除いてはカッコは必要とされない)
( , ) - ひとつ以上の引数の指令を表す

訳注、黄色の文字は Revision 1.3 での追加変更


1)カメラ(Camera)

Antialiasing ( )
Camera [ ]
Clipping ( , )
DepthOfField ( , )
Exposure ( , )
FieldOfView ( )
Format ( , )
FrameAspectRatio ( )
LensModel ( )
Undersampling ( )

PixelFilter ( , )


2)条件付処理(Conditional processing)

else { ...}
if { ... }


3)定義(Definitions)

Declare ... = ...
let ... = ...
new ... = ...
static ... = ...


4)組込関数(Built-in Function)

acos ( )
asin ( )
atan ( )
atan2 ( )
bias ( , )
ceil ( )
circular1 ( )
circular2 ( )

clamp ( , )
cos ( )
cosh ( )
degrees ( )
distance ( , )
dnoise ( )
exp ( )
fabs ( )
fBm ( , )
floor ( )
fmod( , )
fcellnoise ( , )

fnoise( , )
gain ( , )
greyscale ( , )

HSVColorWheel ( )
int ( )
inversesqrt ( )
legendre ( , )
length ( )
log ( )
log10 ( )
max ( , )
min ( , )
mix ( , )
noise ( )
normalize ( )
pow ( , )
pulse ( , )
radial1 ( )
radial2 ( )

radians ( )
ramp ( )
random
reflect ( , )
refract ( , )
Rotate ( , )
round ( )
sawtooth ( )
scnoise( , )
sign ( )
sin ( )
sinh ( )
smoothstep ( , )
spline ( , )
sqrt ( )
step ( , )
tan ( )
tanh ( )
trace ( , )
vcnoise ( )
visibility ( , )
vcellnoise ( , )
vnoise ( )
voronoi ( , )

wave ( , )

5)全般(General)

Background ( )
ComputeIrradiance ( )
Fog ( , )
GroundFog ( , )
Media ( , )
Photons ( , )
ReadArchive ( )
ReadMeshFile ( )
Version( )


6)幾何学図形(Geometry)

BicubicPatch ( , )
Blobby ( , )
Box ( , )
Cone ( , )
Cylinder ( , )
Disk ( , )
ExtrudedSurface ( , )
ImplicitPlanarHeightField ( , )
ImplicitSphericalHeightField ( , )
ImplicitSurface ( , )
NURBS ( , )
Paraboloid ( , )
ParametricSurface ( , )
PlanarHeightField ( , )
Plane ( , )
Polygon ( , )
PolynomialSurface ( , )
Ring ( , )
Shape [ ]
SmoothNormal
Solid [ ]
Sphere ( , )
SphericalHeightField ( , )
Superquadric ( , )
SurfaceOfRevolution ( , )
Torus ( , )
TriangularPatch( , )
UV ( , )


7)光源(Light sources)

AreaLight [ ]
BlackHole ( , )
Bulb ( , )
Decay ( )
DirectionalLight [ ]
Glow ( )
Intensity ( )
LightingAttributes ( )
MediaInteraction
Plane ( , )
PointLight [ ]
Range ( )
SkyLight ( , )
SpotLight [ ]
SunLight ( , )


8)オプション(Options)

AdaptiveDepth ( )
AdaptiveThreshold ( )
BitsPerPixel ( )
GammaCorrection ( , )
HenyeyGreenstein ( )
IrradianceBlendingArea ( )

IrradianceBounceLevel ( )
IrradianceMaxErrorr ( )
IrradianceSamples ( )
IrradianceDistribution ( )
IrradiancePhotons ( , )
LoadIrradianceCache
LoadPhotoMap
MaxBlurLevel ( )
MaxBlurSamples ( )
MaxRayLevel ( )
Options [ ]
OutputTo ( )
ParallelSunRays ( )
PhotonsAccelerator ( , )

PhotonsGatherRange ( , )
SaveIrradianceCache
SavePhotonMap
ShadowBias ( )
SoftShadowSamples ( )
SunGlow ( )
SunLightRotation ( )

ZchannelDepth ( )


9)パーティクル (Particle System)

Acceleration ( )
Aging ( )
Birth ( )
CollisionDetection ( )
Death ( )
Location ( )
ParticleGenerator [ ]
Particles ( )
Shape ( )
Velocity ( )


10) 実行時関数変数(Run-time - functional - variables)

Age
Color
FirstFrame
LastFrame
CurrentFeame
AnimationLength
E
I
N
Opacity
P,
Po,
Puv
V
u,v,w
x,y,z


11)シェーダ(Shader)

Absorption ( )
AmbientColor ( )
BlinnSpecularBRDF ( )
Bumpiness ( , )
Caustics ( , )
Color ( )
Composite [ ]
CookSpecularBRDF ( )
CylindricalBumpMapping     (これはfunction)
CylindricalImageMapping    (これはfunction)
CylindricalIndexedMapping  (これはfunction)
Dispersion ( , )
EnvironmentMapping ( , )   (これはfunction)
FunctionalSurface [ ]
GaussianSpecularBRDF ( )
ImageFile
Indexed [ ]
InternalCaustics
IntersectionPointModifier
Iridescence ( , )
Ka ( )
Kb ( )
Kd ( )
Kr ( )
Ks ( , )
Kt ( , )
Maps ( , )              (これはfunction)
MetalAttribute ( )
MultiLayer [ ]
NormalModifier ( )
Octaves ( )
PatternScale ( )
PatternSurface [ ]
PatternModifiers ( , )
Phase ( )
PhongSpecularBRDF ( )
PlainSurface [ ]
PlanarIndexedMapping    (これはfunction)
PlanarBumpMapping       (これはfunction)
PlanarImageMapping      (これはfunction)
PixelHeight ( )         (これはfunction)
ReflectionColor ( )

ReitzSpecularBRDF ( )
Shader [ ]
SpectrumOfColors ( , )
SpectrumOfShaders { , }
SphericalBumpMapping    (これはfunction)
SphericalImageMapping   (これはfunction)
SphericalIndexedMapping (れはfunction)
ToroidalBumpMapping     (これはfunction)
ToroidalImageMapping    (これはfunction)
ToroidalIndexedMapping  (これはfunction)
Turbulence ( )
UVBumpMapping           (これはfunction)
UVImageMapping          (これはfunction)
UVIndexedMapping        (これはfunction)


12)シェイプ修飾(Shape modifiers)

Bound ( , )
DisplacementMapping ( )
FerrariSolver
RenderBound ( , )
ShadingAttribute ( )
ShapeSubdivisions ( , )
SturmSolver
VietaSolver


13)シェイプ、シェーダとエリアライト変形修飾(Shape,Shader and Area Light transformation modifiers)

Rotate ( )
Scale ( )
Shear ( , )
Transform ( , )
TransFormationStack [ ]
Translate ( )


14)タイミング(Timing)

AnimationLength ( )
FirstFrame ( )
LastFrame ( )
Sequence [ ]


2.4 シーン記述方法(Scene Description method)

VirtuaLightインターフェイスを使用するうえで、3Dシーンを記述する厳密な規則はありません。
もし2.1節と3節に記されてる決まりがきちんと考慮されていれば、記述の仕方は書く側の裁量に任せられています。
これはレンダラが、完全に入力ファイルを解析した後にのみイメージを作成し始めるからです。
シェイプ、シェーダと変数宣言が必ずアクティブに使用されるまえに定義される限りは、記述が与えられる順番には依存しません。

しかしながら、このセクションの目的は標準的な命名法を提示することです。
それは能率的でそして簡潔です。


1) シェーダ定義がシーンの .VS 入力ファイルに書かれるべきでです。

2) 行
ReadArchive "statics.vib" は VS ファイルの先頭に含まれるべきです、その事によりすべての定数と前もって定められたシェーダ式はどこででも使用可能になります。


3) .VIB 入力ファイル内では、文字列組織が表現形式を持つべきである:

Version
(もし "statics.vib"を使用するなら指定してはいけません、なぜなら Version はその中に含まれるからです)

Option list
(何らかのオプションが指定されているか有効な場合)

Timing setting
(入力ファイルが実際にアニメーションシーケンスを記述する場合)

Specific variable definitions
(変数式がカメラ、光源あるいは幾何学的記述に必要な場合)

Camera description
(構図を無視しない限りこれを忘れることは困難)

Lights description

(シーンに光源が無い場合は警告メッセージが表示されるが、レンダリングは続けられる。
理論上、レンダラはglobal illuminationオプションが有効ならイメージを作成するのに光源を必要としない。
その場合、プログラムは、シーン空間での放射される光エネルギーの量を決定するために、各サーフェイスの環境スケール値を使用する。しかし、光源が無い事は影が無い事を意味し、 caustics を持つ可能性が無い事も意味する、なぜならphotonマッピング技法は動くために少なくとも光源を必要とする。)


Geometry description

(シーン内のシェイプとソリッド位置の完全な記述のリスト。これはしばしば入力ファイルのより長い部分。
各シェイプあるいはソリッドは内にサーフェイスに影響したシェーダ構造体名、VS入力ファイルであらかじめ宣言されていなければならない、を持っていなければならない。しかし、このシェーダの修正はまだそこから行うことが可能。)


4.明快さのために、長い構造体はいくつかのラインに展開すべきである:例えば

declare green_glass = Shader [ FunctionalSurface [
    Color '0,1,0'
    Ka 0.025
    Kd 0.1
    Kr 0.15
    Ks 0.25
    BlinnSpecularBRDF 8
    Kt (0.98 + |N . I|, 1.4)
    Caustics 0.45
  ]
]

しかしながら、1行に間単位当てはまる短い構造体は展開すべきではない:

PointLight [ (20, 40, -30) Intensity 30*'1,1,1' Decay LINEAR ]
Solid [ Ball1 * Ball2 + Ball3 [ Scale(1, 2, 1) ] Translate(-2.5, 5, -5) green_glass ]


5)異なるオブジェクト(単一のシェイプやソリッドによって表された)は空白行で区切るのが賢明である

Solid [
  Shape [ Polygon(3,(552.8, 0.0, 0.0), (549.6,   0.0, 559.2), (556.0, 548.8, 559.2)) ]+
  Shape [ Polygon(3,(552.8, 0.0, 0.0), (556.0, 548.8, 559.2), (556.0, 548.8,   0.0)) ]
  red_cornell
]

Solid [
  Shape [ Polygon(3,(130.0, 165.0,  65.0), ( 82.0, 165.0, 225.0), (240.0, 165.0, 272.0)) ]+
  Shape [ Polygon(3,(130.0, 165.0,  65.0), (240.0, 165.0, 272.0), (290.0, 165.0, 114.0)) ]+
  Shape [ Polygon(3,(290.0,   0.0, 114.0), (290.0, 165.0, 114.0), (240.0, 165.0, 272.0)) ]+
  Shape [ Polygon(3,(290.0,   0.0, 114.0), (240.0, 165.0, 272.0), (240.0,   0.0, 272.0)) ]+
  Shape [ Polygon(3,(130.0,   0.0,  65.0), (130.0, 165.0,  65.0), (290.0, 165.0, 114.0)) ]+
  Shape [ Polygon(3,(130.0,   0.0,  65.0), (290.0, 165.0, 114.0), (290.0,   0.0, 114.0)) ]+
  Shape [ Polygon(3,( 82.0,   0.0, 225.0), ( 82.0, 165.0, 225.0), (130.0, 165.0,  65.0)) ]+
  Shape [ Polygon(3,( 82.0,   0.0, 225.0), (130.0, 165.0,  65.0), (130.0,   0.0,  65.0)) ]+
  Shape [ Polygon(3,(240.0,   0.0, 272.0), (240.0, 165.0, 272.0), ( 82.0, 165.0, 225.0)) ]+
  Shape [ Polygon(3,(240.0,   0.0, 272.0), ( 82.0, 165.0, 225.0), ( 82.0,   0.0, 225.0)) ]
  white_cornell
]




next