RenderSan

the RenderMan® community of Japan

平光勝明と申します。
表題の件につきまして、先日はお話をお聞き頂きまして、
誠にありがとうございました。

遅くなりましたが、プレゼン内容の pdf 、
及び、説明に使用した動画 avi をアップさせて頂きます:

(1)RSL_fundamentals.pdf (約1MB)
(2)move_noisePosition.zip (約100KB)
(3)merge_noiseLayer.zip(約2MB)

(2), (3) は解凍して頂くと avi ファイルになります。


使用した shaderとribファイルの方は、
準備が整い次第、改めてアップさせて頂きます。
尚、フラクタルによる雲シェーダに関しましては、
少しバージョンを落としたソースにてアップさせて頂くことを、
何卒ご了承頂けたら、大変嬉しく思います。


また、プレゼン内容に関するご質問などがございましたら、
このトピックにて、受け付けさせて頂きます。
至らない部分も多々ございますが、
今後とも、何卒、宜しくお願いいたします。

--katsu

Views: 647

Attachments:

Reply to This

Replies to This Discussion

平光です。お疲れさまでございます。


前の書き込みの「RSL_fundamentals.pdf」内の、
p16~28 に使用したシェーダを、今回アップさせて頂きました。

(1)my_shaders.zip

解凍して頂くと、下記のファイルになります:

  ・.sl ... RSL シェーダソースファイル
  ・.slx ... Aqsis のシェーダオブジェクトファイル
  ・.rib ... レンダリング用の rib ファイル
  ・.bmp ... レンダリング結果画像


また、myReflectTrace.sl にて、trace() 関数の代わりに私が使用した
myTrace() 関数について、少しご説明させて頂きます:

////////////////////////////////////
color myTrace(vector dir)
{
vector dirW = vtransform("current", "world", dir);
float v = 0.5 * (ycomp(dirW) + 1.0);
color c0 = color(0, 1, 0);
color c1 = color(1, 1, 1);
color c2 = color(0, 0, 1);
/* color result = spline("linear", v, c0, c1, c2);*/
color result = mix(c1, c2, v);
return result;
}
////////////////////////////////////

この関数は、交差判定はしておらず、単純に、
引数としては渡されたベクトル dir のワールド座標系における
y 座標の値に応じて、色を返すだけの関数です。
尚、dir は normalize() 関数などによる正規化が行われている必要があります。


一行ずつ、細かく見ていきたいと思います。
まず、引数の dir を vransform() 関数を使って、
ワールド座標系に変換します:

vector dirW = vtransform("current", "world", dir);

次に、ワールド座標系の dirW の y 座標の値を ycomp() 関数を使って取得します。
この時、dirW は正規化されたベクトルですから、y 座標値の範囲は [-1, 1] です。
このままですと、後々、都合が悪いので、この範囲を +1 オフセット、
且つ、0.5 倍スケールをかけて、[0, 1] の範囲に移してあげます:

float v = 0.5 * (ycomp(dirW) + 1.0);

具体的には、

y座標値が -1.0 の時、v は 0.0
y座標値が 0.0 の時、v は 0.5
y座標値が 1.0 の時、v は 1.0

となり、範囲が [-1, 1] から[0, 1] に移ったことが判ります。
次に、適当に色を定義します:

color c0 = color(0, 1, 0);
color c1 = color(1, 1, 1);
color c2 = color(0, 0, 1);

c0 は緑、c1 は白、c2 は青です。
このうち、c1, c2 の2色を、前述の [0, 1] の範囲の v の値で
混色を行います。混色を行う時、mix() 関数がよく用いられます:

color result = mix(c1, c2, v);

この mix ()関数はベタで書くと、以下のようになります:

color result = (1.0 - v) * c1 + v * c2;

よって、

v が 0.0 の時、result は (1, 1, 1)
v が 0.5 の時、result は (0.5, 0.5, 1)
v が 1.0 の時、result は (0, 0, 1)

となり、纏めると、この myTrace() 関数は、

y座標値が -1.0 の時には、(1, 1, 1)を、
y座標値が 0.0 の時には、(0.5, 0.5, 1)を、
y座標値が 1.0 の時には、(0, 0, 1)を

返す、といったように、
y 座標の値によって、白から青へのグラデーション色を返す関数、
ということになります。



この myTrace() は、酷いなんちゃっての映り込みになりますが、
もっとシェーダコードを工夫することで、
実際に背景のオブジェクトを置いてレイトレースせずとも、テクスチャも使わなくとも、
軽い処理で、それっぽい映り込みを表現することも可能でしょう。

そこがまた、シェーダの楽しいところだと感じております。
Attachments:

RSS

© 2017   Created by Bernard Edlington.   Powered by

Badges  |  Report an Issue  |  Terms of Service