April 9, 2009

RenderManのシェーディング言語

RenderManのシェーディング言語

RISpec を見ながら気長にやっていこうと思います。

主要な shader は5つ

RISpecの120頁に "There are thus five major types of shaders" って書いてあった。
どうやら、主要な shader は5つあるみたいです。

  • Light source shaders
  • Displacement shaders
  • Surface shaders
  • Volume shaders
  • Imager shader

変数

グローバル変数

All the predefined variables which are available to each type of shader are shown in Table 12.1,

130頁にこう書いてありました。変数も定義されているみたいです。shader によってちょっと違う。
(フィーリング読みだから、あっているかわかりませんが、たぶんそんな意味だと思う)

  • Table 12.1: Predefined Surface Shader Variables (132頁)
  • Table 12.2: Predefined Light Source Variables (133頁)
  • Table 12.3: Predefined Volume Shader Variables (133頁)
  • Table 12.4: Predefined Displacement Shader Variables (134頁)
  • Table 12.5: Predefined Imager Shader Variables (134頁)
変数の型

125頁からの Section 11 TYPES に書いてあった。

  • float
  • color
  • point
  • vector
  • normal
  • matrix
  • string
  • array

座標空間

Table 4.2: Point Coordinate Systems (32頁) に書いてありました。
基本、書いてある英語が理解できなかった。けど、とりあえず暗記。

  • object
  • world
  • camera
  • screen
  • raster
  • NDC

RSL を記述する

Appendix A STANDARD RENDERMAN INTERFACE SHADERS (166頁) を参考にしながら試しにやっていこうと思います。やることはメモ帳などのテキストエディタでソースファイル(拡張子は sl )を書いていくだけです。

matte.sl
surface
matte(
    float Ka = 1;
    float Kd = 1;)
{
    normal Nf = faceforward(normalize(N), I);
    Oi = Os;
    Ci = Os * Cs * (Ka * ambient() + Kd * diffuse(Nf));
}
plastic.sl
surface
plastic(
float Ka = 1;
float Kd .5;<br /> float Ks .5;
float roughness .1;<br /> color specularcolor 1;)
{
normal Nf = faceforward(normalize(N), I);
vector V = -normalize(I);
Oi = Os;
Ci = Os * (Cs * (Ka * ambient() + Kd * diffuse(Nf)) +
specularcolor * Ks * specular(Nf, V, roughness));
}

いまいちよくわからないけど、こんな感じ。

RSL をコンパイルする

書き写したソースファイルをコンパイルしますが、そのコンパイラは使用するRenderManのレンダラーによって異なります。

例えば、レンダラーが 3Delight なら shaderdl で書き出されるファイルの拡張子は sdl で、Pixie なら sdrc がコンパイラで sdr が書き出されるファイルの拡張子です。 Aqsis の場合はコンパイラがaqsl でファイルの拡張子は slx となります。

僕の場合は Pixie なので sdrc plastic.sl matte.sl と打ちます。
2個連続でコンパイルかけています。plastic.sdr と matte.sl が出てきます。

RIB ファイルを用意する

コンパイルしたshaderがどういう効果を持っているのかを確かめるためRIBファイルを作成します。

matte.rib
Display "matte.tiff" "file" "rgba"
Projection "perspective"
    Translate 0 0 2
WorldBegin
    LightSource "ambientlight" 1
    "intensity" [0.2]
    LightSource "spotlight" 2
    "from" [2 2 -2]
    "to" [0 0 0]
    "intensity" [5]
    Color [1 0 0]
    Surface "matte"
    Sphere 1 -1 1 360
WorldEnd
plastic.rib
Display "plastic.tiff" "file" "rgba"
Projection "perspective"
    Translate 0 0 2
WorldBegin
    LightSource "ambientlight" 1
    "intensity" [0.2]
    LightSource "spotlight" 2
    "from" [2 2 -2]
    "to" [0 0 0]
    "intensity" [5]
    Color [1 0 0]
    Surface "plastic"
    Sphere 1 -1 1 360
WorldEnd

このRIBファイルの違いは、Surface "matte" なのか Surface "plastic" なのかというところだけです。それ以外の違いはありません。

結果

matte.rib

matteだから反射してなければいいのかな?(笑
だとしたら、まぁ良い感じなのかな。わからないw

matte.rib の結果

plastic.rib

プラスチックっぽい質感・・・・・・、なんだろうか。。。(笑
もうちょっと試行錯誤したほうが良さそうですね。

plastic.rib の結果