renderman言語による摂動画像テクスチャの実装


8

私は(C#で)イメージの摂動アルゴリズムを実装しようとしています(「テクスチャリングとモデリング-K.パーリンら」(誰かが持っている場合は91ページ))で、イメージを歪めています。次のコードはRenderman言語で記述されています。テクスチャアクセス

Ct = texture("example.tx", s, t);

に置き換えられます

point Psh;
float ss, tt;
Psh = transform("shader", P);
ss = s + 0.2 * snoise(Psh);
tt = t + 0.2 * snoise(Psh+(l.5,6.7,3.4));
Ct = texture("example.tx", ss, tt);

左の画像を右の画像に変換します。 ここに画像の説明を入力してください

私が理解していないことから、座標にアクセスする代わりに、わずかに摂動した座標にアクセスしそれらを場所に表示して、わずかに摂動したように見える画像を作成します。(s,t)[0,1](ss,tt)(s,t)

snoise(x)はとして定義され、からにノイズをマッピングし、RenderManのドキュメントでは、Pがポイントである返します。ノイズに基づく値(おそらくパーリンまたはラティス)。(http://renderman.pixar.com/resources/current/RenderMan/noiseFunctions.html(noise(x)2)1[0,1][1,1]noise(P)

私が理解していないのは、3DポイントPを「シェーダー」空間にマッピングすることになっている変換関数の機能と、それを実装する方法です。また、noise(x)が3dポイント、float(より理にかなっている)を返すかどうか、また、Perlinのノイズの単純な2d実装を使用して同じ目的の効果を得ることができるかどうかもわかりません。

回答:


6

ご想像のとおり、このtransform()関数はポイントをある座標空間から別の座標空間に変換します。(もありますvtransform()し、ntransform()それぞれ、方向ベクトルと法線ベクトルを変換するため。)文字列引数名に変換する座標スペース。

Rendermanのシェーディングガイドラインは、それについて言うためにこれを持っています:

シェーダー実行の開始時に、すべてのポイント、ベクトル、法線、および行列変数は「現在の」座標系で表されます。どの座標系が「現在」であるかは、実装によって異なります。たまたま、「現在」はPRMan *の「カメラ」ですが、この動作を当てにしてはいけません。他のRenderMan準拠のレンダラー(Pixarの将来のレンダラーを含む)が他のスペース( "world")を "current" spaceとして。

例として、このようなケースを続けます。ほとんどの照明計算はカメラ空間で行う必要がありますが、ノイズ関数の評価はオブジェクトの座標系で行う必要があります。これは、オブジェクトがワールド空間を移動するときにノイズを同じに保つ必要があるためです。

C#の実装では、シェーディングされるポイントをカメラ空間からオブジェクトの座標系に変換する必要もあります。たぶん、テクスチャ座標を計算する前に、これをすでに行っているかもしれません。そうでない場合は、オブジェクトの変換行列を乗算する必要があります。この変換された点は、Perlinノイズジェネレーターへの入力(シードのような)としてのみ使用されることに注意してください。それは、ノイズが変化するドメインを設定します:ワールド空間座標。

RSLでは、noise()関数はfloat、a color、a point、a 、aなど、任意のタイプを返すことができますvector。別のfloatuまたはv)に追加するとfloat、このコードでを取得します。実際には、2つのnoise()コールは、に加えsそしてt、単一の2次元雑音ベクトルを生成するために行動しています。独自のコードでは、2Dベクトルを使用してテクスチャ座標を格納している場合、2Dベクトルを返す単一のノイズ関数を使用して、1行のコードで同じ効果を得ることができます。


素敵なノイズジェネレーターの作成に関心がある場合、Shadertoyにはさまざまなプロパティ(等方性かどうか、設定可能な平滑性と帯域幅)を備えたPerlinノイズのさまざまなバリアントを備えた多くのノイズシェーダーがあり、インスピレーションと実装のヒントを確認する価値があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.