3.13 Shaders

 
一般的に、シェーダはサーフェイスとそれの上に輝くライトの影響の仕方については記述します。
VirtuaLightインターフェイスでは、シェーダはサーフェイス構造体、そして最後に幾つかの変換修飾を含む構造体です。
慣習では、シーンのためのシェーダは宣言されてそして別々の入力ファイルに記述されます、それはVIBシーンファイルと同じ名前を持ちますが、しかし拡張子は .VS です(VirtuaLight Shader)。
これは、2つの部分を読み込みを良好にするので、シェーダ定義の命令で幾何学図形記述を混乱させません。
しかし、もしシェーダの記述が入力ファイル VIB 内部で行われるなら、レンダラはエラーとは見なさず、そして静かに情報を解析するでしょう。


シェーダ構造体の一般的なシンタックスは:

Shader [[surface_definition] [optional_transformation_modifiers]]

VS入力ファイル内で全てのシェーダは宣言されなければなりません。

Example:
Declare RedWood = Shader [[surface_definition][optional_transformation_modifiers]]
or
static RedWood = Shader [[surface_definition][optional_transformation_modifiers]]
 
対応する VIB 入力ファイル内で、各シェイプあるいはsolidはその構造体の中にそのサーフェイスに影響を与えるシェーダの名前を持っていなければなりません。(もちろん既に VS ファイルで宣言された)

Example:
Shape [ Cylinder(...) RedWood ]

しかし、このシェーダの修飾はまだコールされるシェイプ構造体から可能です。

Example:
Shape [ Cylinder(...) RedWood [ Scale(...)] ]

同じ様に、より現実的なシェーダを作成するために、インターフェイスはシェーダを結合させるための3つの異なった方法を提供します。
これらは Multi-layerシェーダConpositeシェーダそしてIndexedシェーダと呼ばれます。

このケースでのシェーダの構造体のシンタックスは:

Shader [[shader combination definitions] [optional_transformation_modifiers]]

 

3.13.1 Surface definition

 
サーフェイスの定義はシェーダの心臓部です、なぜならそれはサーフェイスがどのようにライトに反応しなければならないか、そしてどの種類のマテリアルがそれと共に使用されるかをレンダラに通知します。
サーフェイスは構造体中で定義されます。
そこには3種類のサーフェイス定義があります、単純(plane)サーフェイス、パターン(pattern)サーフェイスそして関数(functional)サーフェイスです。

最初のものはインターフェイスで利用可能なサーフェイスの最も単純な形式です。
それはレンダリングの速度もまた速い形式です。
それは単純なサーフェイスを記述するために使用されるべきです。

シンタックスは:

PlainSurface [list of components]
 
2番目のものは、シーンの最初のものを改良したものです、それは色のスペクトルのパターンの無限の数を作成し、そしてもっと洗練されたサーフェイスをデザインするためにサーフェイスの法線を修正する事を可能にします。
この全ては少数の排他的な指令によってこの方法に供給される組込の手続きを使用して行うことができます。

シンタックスは:

PatternSurface [list of components]
 
3番目のものは、法線を逸らす、シェーディング前に交点を修正する関数、テクスチャマッピング関数などの関数定義と同様に、ライティングモデルの構成要素のために式で使用可能な非常に柔軟なタイプのサーフェイスです、
セクション3.2で記述される全ての実行時変数は、どの関数サーフェイス定義内でも使用可能です。
しかし記述された関数の複雑さによって、そのようなサーフェイスの評価とレンダリングは最初の2つより、長く掛かるでしょう。

シンタックスは:

FunctionalSurface [list of components]
 
実際に、FunctionalSurfaceはインターフェイスの唯一のものです、なぜならそれはほとんど全てのケースのサーフェイスをカバーする事が可能だからです。
しかし、それは使用するために他よりもより複雑で、そしてケース中で最もレンダリングに長く掛かるという結果になります。
ユーザによって書かれた、関数サーフェイスで定義された全ての式は光線とサーフェイスのそれぞれの交点で評価されるので、それは理由になります

どんなタイプであったとしても、どのサーフェイスでも宣言可能です。
これは基本的なサーフェイスの定義の使用と、そしてシェーダ構造体からのその記述を完成させるか修正することを可能にします。

For example:
Declare plastic=PlainSurface [Kd 0.65 Ka 0.1 Ks(0.5,'1,1,1') PhongSpecularBRDF 12]
Declare red_plastic = Shader [plastic [Color '1,0,0']]
Declare blue_plastic = Shader [plastic [Color '0,0,1' BlinnSpecularBRDF 15]]

シェーダ red_plastic と blue_plastic は同じサーフェイス定義から作成されます、しかし同じようには完成しません、従ってそれらは異なる結果を与えます。


3.13.2 Plain surface

 
PlainSurface、PatternSurfaceおよびFunctionalSurfaceへの共通のオプションの指令は次のとおりです:

Color
Ka
AmbientColor
Kd
Kb
Ks
BlinnSpecularBRDF
CookSpecularBRDF
GaussianSpecularBRDF
PhongSpecularBRDF
ReitzSpecularBRDF
Kr
ReflectionColor
MetalAttribute
Kt
Caustics
Iridescence
Dispersion
Absorption

 
それらはPlainSurfaceの全ての構成要素を表します。
PatternSurfaceとFunctionalSurfaceは対応するセクションで説明する、追加の特有の指令を持っています、


3.13.2.1 Body color

 
サーフェイスのメイン色、それは全ての方向にサーフェイスによって反射する拡散の色について言及します。
デフォルトではこの色は白です。

シンタックスは:
 
Color rgb color
 
 

3.13.2.2 Ambient light

 
サーフェイスそれ自身から発せられる一定量の光について言及します。
それは方向を持たず、シーン中にあるかもしれないどのライトからも独立しています。

シンタックスは:
 
Ka float scale
 
scale値は0.0から1.0の範囲に存在するべきです。
特にglobal illumination が有効に場合は、常にambient lightを非常に低くしておくかそれを全く使用しない事は推奨されます。
しかし、特にglobal illumination と共に使用する場合は、それは自己照明のサーフェイスには有用です。
もしambient色の放射がサーフェイスの実体色(color)と異なっていたら、AmbientColor指令がこの色の指定に使用されます。

シンタックスは:
 
AmbientColor rgb color


3.13.2.3 Diffuse light

 
サーフェイスによって吸収される入射ライトの量と、そして全ての方向に平均に再放射
される量について言及します。
diffuse light の輝度はライトとサーフェイスの角度に正比例します。

シンタックスは:
 
Kd float scale
 
scale値は0.0から1.0の範囲に存在すべきです。
指令 Kb は Kd とサーフェイスの輝きのコントロールとの相互作用で働きます。
それは入射角に依存するライトの減少する仕方を変えるために使用することが出来ます。
これはシェイプの基本的な拡散照明をタイトにコントロールし、そしてサーフェイスの光沢の外観をわずかに調整します。
オブジェクトはそれらの輝きを増大させることによって、よりメタリックに見えるかもしれません。

シンタックスは:
 
Kb float scale

デフォルトのscale値は1.0です。
5.0から約10.0のより高い値は、ライトを中間から低い角度へさらに少なく減少させる原因になります。


3.13.2.4 Specular highlights

 
highlightsは拡散ライトがサーフェイスの広いエリアを被う微小多面(microfacets)にぶつかった結果です。
それらは鏡のようです、なぜならそれらは視野角と照明角に依存しているからです、しかしそれらはその上に拡散のようです、なぜなら幾らかの分散が存在するからです。
正確にハイライトをモデル化するために、レンダラはmicrofacetsと呼ばれる何千という微視的なバンプの鏡面反射を計算します。
より多くのmicrofacetsが視る方に面していると、より光沢のあるサーフェイスが現れ、そしてハイライトはよりタイトになります。
輝きとハイライトの基本色は Ks でコントロールされます。

シンタックスは:
 
Ks float scale
or
Ks (float scale, rgb color)
 
輝きを決定するscale値は、0.0から1.0の範囲に存在するべきです。
2番目のケースでは、colorは光源からのものの代わりに使用するハイライト色を設定します。
どのように鏡のようなハイライトがサーフェイスのために計算されるか決定するために、5つのmicrofacet 分配関数が提供されます:Phong、Blinn、Cook、Trowbridge-Reitz、そしてGaussianです。ただひとつが指定されなければなりません。
 
シンタックスは:

PhongSpecularBRDF float angle
or
BlinnSpecularBRDF float angle
or
CookSpecularBRDF float angle
or
ReitzSpecularBRDF float angle
or
GaussianSpecularBRDF float angle
 
引数angleは全ての関数に対して同じです、しかしそれらは異なる方法でそれを扱います。
この角度は0から45の範囲の値で度で指定されます。
それは鏡にようなハイライトが最大輝度から50%落ちる、減少角度を表しています。
言葉を変えれば、それはサーフェイスの粗さに相当します。
それで、より小さな減少角度は、より小さなハイライトとよりスムーズなサーフェイスになります。


3.13.2.5 Specular reflection

 
一般に同じ平面のサーフェイスから反射した光(吸収されてそして再放射されたものの代わりに)について言及します、それはサーフェイスにぶつかったものです。
サーフェイスから反射した光の角度は、サーフェイスにぶつかった光の角度に依存します。
反射した光は、サーフェイスの見る角度と法線との関係により計算された反射方向にあるすべての色です。

シンタックスは:

Kr float scale
 
scale値は0.0から1.0の範囲内に存在すべきです。
それはスケールに比例した輝度で、反射した全ての色に対応します。
値1.0は完璧な鏡である事を表します。
追加として、もしサーフェイスが1より大きい屈折率を持つなら、レンダラは任意の与えられた入射角のサーフェイスの真の反射率を計算するために、
自動的にFresnel反射率モデルを使用します。
MetaAttribute指令は Kr と共に相互作用で使用されることが可能です。
単純化するために、この機能はそこはメタリックサーフェイスの反射率の良いモデルのために光が反射する、それぞれのポイントで、本体の色により反射光の色を増大させます。
それはライトの色がキラッと光る角度において反映されるように、Fresnel方程式を使用します、そしてメタルの色はサーフェイスの法線に近い角度で反射します。

シンタックスは:

MetalAttribute float scale
 
このscaleの値はこの効果が反映された光の色の影響の量を表します。
それは少なくとも1.0と等しくすべきです。
オプション指令ReflectionColorは、反射されている(サーフェイスのbody colorと異なる)色を修正するためにフィルタのように作用することが可能です。

シンタックスは:
 
ReflectionColor rgb color


3.13.2.5.1 Specular reflection blur

 
この機能は円錐形シェイプ内に反射光を撒き散らす、極微のバンプ(bumpiness)のマテリアルのシミュレートに有用です。
その結果はサーフェイス上の鏡面反射がぼやけて見えるようになります。
このプロパティを有効にするために、2番目のパラメータは Kr に与えられなければなりません。

Kr (float scale, float blurcoeff)
 
scale値は既に説明しています。
blurcoeff は0から1の範囲に存在するべき値を表します。
それはどれくらいブラーを利かせるか指定します。
Option構造体からのMaxBlurSample指令は反射の blur に必要な光線サンプル数をコントロールします。


3.13.2.6 Specular transmission

 
サーフェイスを貫通して行き、そしてサーフェイスの反対側で放射する光につて言及します。
光線がサーフェイスの密集した媒介物を通り抜ける時、それの通り道は曲がります。
このような曲変形は屈折(refraction)と呼ばれます。
光の曲変形あるいは屈折はマテリアルの密度に依存します。
屈折率の値は物質の相対密度を記述するために使用されます。
伝達光は、サーフェイスの見る角度と法線そしてマテリアルの屈折率との関係により計算された反射方向にあるすべての色です。

シンタックスは:

Kt (float scale, float ior)
or
Kt (float scale, float ior, rgb color)
 
scale値は0.0から1.0の範囲内にあるべきです。
それはスケールに比例した輝度で、伝達された全ての色に対応します。
言葉を変えれば、値0.9はサーフェイスにぶつかった光の90%が屈折することを
意味します。

2番目の引数はサーフェイスの屈折率を設定します。
屈折率は物質の相対密度を正確な値の記述です。
ior 値は一般に1.0003(空気)から開始するべきです。
知られている最も高い屈折率のひとつは、3.34(iodine crystal - 沃度水晶)です。

もし3番目の引数が指令されていたなら、これはサーフェイス自身の色から異ならせる伝達フィルタを作成することにより、伝達された色を修正することを可能にします。


3.13.2.6.1 Specular transmission blur

 
反射 blur のように、この機能は円錐形シェイプ内に伝達光を撒き散らす、極微のバンプ(bumpiness)のマテリアルのシミュレートに有用です。
その結果はサーフェイスを通ってぼやけたように見えるということです。
このプロパティを有効にするために、4番目のパラメータが Kt に与えられなければなりません。

Kt (float scale, float ior, rgb color, float blurcoeff)
 
3番目のひとつのパラメータは既に説明しました。
blurcoeff は0から1の範囲に存在するべき値を表します。
それはどれくらいブラーを利かせるか指定します。
Option構造体からのMaxBlurSample指令は屈折の blur に必要な光線サンプル数をコントロールします。
blurcoeff 伝達は blur 反射よりも計算がはるかにより長くかかります。


3.13.2.7 Caustics

 
オブジェクトに caustic 属性を与えるふたつの方法があります:シェイプ修飾(セクション3.9.6)あるいはサーフェイス記述内で、です。
その2番目のケースは,この特徴は自動的にこのサーフェイスに含まれるシェーダで使用される、全てのオブジェクトに属性とみなされることを意味します。
さらにこの属性は、もし問題のサーフェイスが反射(Kr)あるいは/そして屈折(Kt)プロパティを含む場合、そしてもし Photons 指令が設定されている場合のみ効果を表すでしょう。

シンタックスは:

 Caustics (float density, InternalCaustics)
 
パラメータ density はサーフェイスのためのフォトン密度を設定します、それは Photons 指令(セクション3.5.8)の2番目の引数のローカルバージョンです。
値は0.0と1.0の間に含まれていなければなりません。
たとえ2番目の引数である Photons に0が設定されている場合でも、値は絶対に要求されます。
大きな値はそのサーフェイスにたいして相対的により多くのフォトン(サーフェイスとメディア)を生成します。
InternalCausticsは透明のシェーダに時々有用です、なぜならそれはレンダラに可能な限りの全体の内部反射光のcausticsを計算する事を強いるからです。

 

3.13.2.8 Iridescence

 
微視的な透明フィルムオーバレイを備えたサーフェイスに対する光の効果をシミュレートします。
それはニュートンの薄膜干渉(Newton's thin film interference)と呼ばれています。
最も有名な例のひとつは石鹸の泡の虹の色です。
これは起こります、なぜなら光線がフィルムのサーフェイスにぶつかった時、部分がフィルム中に伝達されている間に、光の一部はそのサーフェイスから反射するからです。
この表面下の光線はフィルムを通り過ぎて行き、そして最後には不透明な下層で反射します。
光はフィルムからわずかに位相をずらして、サーフェイスから反射した光線と共に
出て来ます。
法線の修飾関数を使用を通してオブジェクトのサーフェイスの法線を乱すことがiridescence に影響するだろうということに注意してください。

シンタックスは:

Iridescence(float amount, float film, float turb)
or
Iridescence(float amount, float film, float turb, rgb color)
 
最初の引数は全体のサーフェイス色への iridescence の効果の寄与です。
値は0.0から1.0の範囲にあるべきです。
2番目の引数はフィルムの厚さを決定します。
それはサーフェイスのスケールには関係しません。
それの変更はスケールあるいは忙しさに影響を与えます。
とても薄いフィルムは高い周波数の色変化を持ち、一方厚いフィルムは大きな区域の色を持つでしょう。
値は同じく0.0から1.0の範囲にあるべきです。
3番目の引数は混乱係数です、それはフィルムの厚さに影響を及ぼします。
値は0.1から2.0の範囲にあるべきです。一言で言えば、より大きな値はより混乱したパターンになります。
オプションの4番目の引数は赤、緑、青の原色の主要な波長を調整するために使用可能です。
デフォルト値が適切であるので、これは本当は必要ではありません。


3.13.2.9 Irradiance samples


この特徴はper-shader basis上にirradiance サンプリングをコントロールすることを可能にします。
それは、シェーダの使用する全てのシェイプのためのirradiance を推定するために打ち出す分配光線サンプル数を設定します。
このケースでは、IrradianceSamples (セクション3.4)で指定された値は、問題のシェーダに関してはオーバライドされます。
例えば、それらが他のものと比較して多くのサンプルを必要としないので、反射そして屈折のサーフェイスのために低いサンプル数を設定するために、これは非常に有用です。

シンタックスは:
 
IrradianceSamples int samples



3.13.2.10 Dispersion


すべての透明な用品については、屈折率が波長の機能としてスペクトルおよび変更の全体にわたって一定ではありません。したがって、透明な材料を通り抜ける光は、波長によって分離されるでしょう。これは色の分散と呼ばれます。それが全く計算集約的なプロセスであるので、この特徴はデフォルトによって考慮に入れられません。遮光物に色の分散を与えるために、シンタックスは次のとおりです:

全ての透明なマテリアルでは、屈折率がスペクトルや波長の機能の変化全体に渡って一定では有りません。
従って、透明なマテリアルを通り抜ける光は、波長によって分離されるでしょう。これは色の分離(chromatic dispersion)と呼ばれます。
それが全く計算集約的なプロセスであるので、この特徴はデフォルトによって考慮に入れられません。
シェーダに色の分離を与えるためのシンタックスは次のとおりです。

Dispersion(float amount, int samples)

最初の引数は紫から赤用の屈折の比率です。それは使用される分散の強さをコントロールします(色が幾らかは広がりました)。それは通常 1.001から1.0(例えば水=1.007ダイヤモンド=1.035)までの範囲にあります。
1.0の値は分散を与えません。
2番目の引数はスペクトルの色ステップおよび平滑の量をコントロールします。それはサーフェイスのなかでプリズムの色効果を作成して計算するためにサンプル数を設定します。15付近の値は通常かなり良好ですが、60かあるいはそれ以上の値が非常に滑らかな結果を得るために必要かも知れません(特にクローズアップ用)。
photonマッピングが有効の時、プリズムの色の caustics は caustics と 分散の両方を備えたシェーダのために作成されます。




3.13.2.11 Absorption


この特徴は、それが表面(例えばろう)を通って移動するとともに任意の透明な資料が光を吸収することを可能にします。光の吸収は、オブジェクトを入って来る波の周波数に暗いか不透明にします。ウッドは可視光線に不透明です。いくつかの用品は光のいくつかの周波数に不透明であるが、他のものに透明です。グラスは紫外線に不透明であるが、可視光線に透明です。これ、Krが使用される場合、工場だけを特色とします。シンタックスは次のとおりです:

これの機能は、それがサーフェイスを通って移動すると共に任意の透明なマテリアルが光を吸収することを可能にします(e.g. ろう)。
光の吸収は入ってくる波の周波数によりオブジェクトを暗くしたり不透明にします。木は可視光線に不透明です。あるマテリアルはある周波数の光に不透明ですが、他のものには透明です。ガラスは紫外線には不透明ですが、可視光線に透明です。
この機能は Kr が使用されているときのみ働きます。

Absorption float amount

amount はユニット・エリア当たりの光吸収の量をセットします。値は、通常、0.0(吸収はない)から0.2までの範囲になります。


3.13.2.12 Example of a plain surface

 
このセクションで記述されたほとんど全ての指令を含むplaneサーフェイスに基いたシェーダ定義の例です。

Declare fancy_glass = Shader [ PlainSurface [
    Ka 0.025
    Kd 0.05
    Ks 0.25
    Kt(0.98, 1.4, '1,1,1')
    Kr 0.15
    BlinnSpecularBRDF 10
    Caustics 0.4
    Dispersion(1.08, 14)
    Absorption 0.04
  ]
]
 
 

3.13.3 Pattern surface

 
PlaneSurface(セクション3.13.2)からの指令もPatternSurfaceでは使用され、加えて8つの追加の指令、それは色のスペクトルと無限の種類のパターンの作成を可能にします、そしてより洗練されたサーフェイスをデザインするためにサーフェイスの法線を修正します。
それはFunctionalSurfaceほど機能的ではありませんが、これの種類のサーフェイスは評価とレンダリングは一般的なものより高速です。
追加として、マルチレイヤによるあるいはcompositeシェーダによる組み合わせパターンのサーフェイスは大きな幅の将来性を可能にします。

これらの新しい指令は:

SpectrumOfColors
PatternModifiers
PatternScale
Turbulence
Octaves
Bumpiness
Phase
 
それらはすべてオプションです、しかし最初の2つは必要なものを得るためにはかなり避けられません。
その FunctionalSurface もまた色のスペクトル(セクション3.13.4)を使用する事に注意を払う必要があります。

 

3.13.3.1 Spectrum of colors

 
ほとんどの色パターンは2つあるいは3つの突然の色変更を使用しません
それらはその代わりにあるポイントから次へ徐々に変わる、多くの色のスムーズな移り変わりを使用します。
VirtuaLightインターフェースでは、色のスペクトルがそれらの値の多くの範囲のためにカラールックアップテーブルを提供します。
この種類のテーブルでは、各色は rgb の要素で表現されます。

シンタックスは:

SpectrumOfColors( [float low_value0, rgb low_color0, float hi_value0, rgb hi_color0]
                  [float low_value1, rgb low_color1, float hi_value1, rgb hi_color1]
                  [ ... ]
                  [float low_valueN, rgb low_colorN, float hi_valueN, rgb hi_colorN] )

 
適切な色を見つけるために、レンダラはパターン関数を評価してそして結果の値を得ます。
それからそれはルックアップテーブルのエントリを、先頭から下方へ結果の値のパターンが low_value と hi_value の間に含まれている、エントリをみつけるまでサーチします。
もしパターン結果の値が low_value と等しければ、最初に指定された色が使われます。
もし hi_value と等しければ、2番目に指定された色が使用されます。
もし値が間なら、関数は2つの色を釣り合うように書き換えます。
0.0〜1.0まで値のあらゆる範囲をカバーするために、十分なエントリーが与えられることを保証することはユーザの責任です。
さらにオプションの透明(alpha) float 値は全てかあるいは幾つかの色のために指定可能です。

シンタックスはこうなります:
 
SpectrumOfColors( [low_value0, low_color0, low_alpha0, hi_value0, hi_color0, hi_alpha0]
                  [low_value1, low_color1, low_alpha1, hi_value1, hi_color1, hi_alpha1]
                  [ ... ]
                  [low_valueN, low_colorN, low_alphaN, hi_valueN, hi_colorN, hi_alphaN] )

 
色の同じスペクトル中のアルファ値がある場合とない場合で色を混合することは可能です。
アルファ値を使用することは、マルチレイヤ、compositeあるいはindexedシェーダで特に有用です、なぜならアルファの量はサーフェイスの伝送要素のスケールで使用されるからです。

どの色のスペクトルも宣言可能です。
ここに色定義のスペクトルの例があります:

static stone02 = SpectrumOfColors(
                     [0.000, '0.894, 0.886, 0.886', 0.154, '0.745, 0.745, 0.753']
                     [0.154, '0.745, 0.745, 0.753', 0.308, '0.902, 0.902, 0.859']
                     [0.308, '0.902, 0.902, 0.859', 0.444, '0.729, 0.706, 0.694']
                     [0.444, '0.729, 0.706, 0.694', 0.615, '0.588, 0.592, 0.635']
                     [0.615, '0.588, 0.592, 0.635', 0.803, '0.608, 0.616, 0.659']
                     [0.803, '0.608, 0.616, 0.659', 1.001, '0.894, 0.886, 0.886'])


この例では、それらに注意してください。

- 第1の色のlow_valueは0と常に等しい。
- 色nのためのhi_valueは、色n+1のそのlow_valueと同じです。
- テーブル中の最後の色のhi_valueは1.0ではなく1.001と等しい。これは、そこに最初と最後の色の間に数値の誤差として認めるべき穴がないと確信するのに時々役に立ちます。

Note:PatternSurfaceは直接宣言された色のスペクトルを使用することは出来ません。
それは常にサーフェイス中に明示的に記述されなければなりません。


3.13.3.2 Pattern modifiers

 
この指令はメインパターンがサーフェイスを覆ってどのように広がるか、そしてその法線がどのように影響を与えられなければならないかをコントロールします。
これは全体的に現れるパターンに影響を及ぼす関数です。
この指令の各引数はパターンの評価している間にに特定の仕事のためにどの組込手続きを使用するかを決定します。

シンタックスは:
 
PatternModifiers(int lookup, int ipmod, int normalmod)
 
最初の引数は色のスペクトルから色をルックアップするために何の関数を使用するかを決定します。
それはルックアップカラーテーブルがサーフェイスを覆って広げる方法を計算します。

可能な値は:

0  未加工(u/v座標ベース) - Natural (based on u/v coordinates)
1 Sine 関数
2 Cosine 関数
3  Catmull-Rom フィルタ
4  1-D 格子ノイズ
5 Ramp 関数
6 Sawtooth 関数
 
2番目の引数は交点ポイントがノイズパターンの生成でどのように使用されなければならないかを決定します。
この関数は他のTuebulenceとOctaves指令との相互作用で働きます。
それはパターンの形成に寄与します。

可能な値は:

0 turbulence なし
1  Turbulence based on run-time variable value Po[x]
2  Turbulence based on run-time variable value Po[y]
3  Turbulence based on run-time variable value Po[z]
4  Turbulence based on run-time variable value P[x]
5  Turbulence based on run-time variable value P[y]
6  Turbulence based on run-time variable value P[z]
7  球形 turbulence
8  円柱 turbulence
9  放射状 turbulence
 
3番目の引数はサーフェイスの法線が、不規則な自然な動揺(perturbation)をシミュレートするために、どのように逸らさなければならないかを決定します。
この関数は他の2つのBumpinessとPhase指令との相互作用で働きます。

Possible values are:
0 perturbation なし
1 Bumps
2 Dents
3 Wrinkles
4  Waves and ripples
 
PatternScale指令はサーフェイスを覆うパターンの全体的なサイズを設定するために使用することが可能です。

シンタックスは:

PatternScale float scale
 
デフォルトでは、それは1.0と等しい値です。
1.0より大きな値はサーフェイス上により多くのパターンを広げます、なぜならそれらはよりたびたび増やされるからです。


3.13.3.3 Turbulence and Octaves

 
Turbulenceはフラクタル(fractalize)のためにPatternModifiersルックアップ関数により生成された、自然な色パターンを混合するのに使用されます。
この関数は広い量でパターンを混合して、そして次により小さな量で再び連続して混合します、それは以前のステップの半分の大きさのステップの詳細を使用する各ステップです。

シンタックスは:
 
Turbulence float amount
 
典型的な値は0(turbulenceなし)から3.0か4.0の範囲です。
より大きな値はより乱れたパターンを生成します。
Turbulenceは"Perlin noise"と呼ばれるランダムノイズ関数を、Octavesと呼ばれる幾つかのステップの周囲でポイントを突き出すために使用します。

シンタックスは:
 
Octaves int step
 
引数はturbulence の計算されたステップ数をコントロールします。
典型的な値は1から10までの範囲です、しかし6を越える余分のステップ数は小さすぎます、それは変更を見ることは困難になりえます。
octavesのより小さな数は、とてもスムーズな波状のturbulenceと速い計算を与えます。
より高いoctavesはよりジャギーなあるいはあいまいなturbulenceを作成しそして計算も長く掛かります。


3.13.3.4 Bumpiness and Phase

 
これらの指令は法線修正組込関数がPatternModifiersによって有効の時に使用されます。
Bumpinessはフラクタルバンプがどれくらいサーフェイスに影響するかを決定して、そして全体のバンプの頻度を決定するために使用されます。

シンタックスは:

Bumpiness (float amp, int freq)
 
amp は振幅をコントロールします。
1.0より大きな値はバンプ効果を増大させ、一方1.0より小さな値はそれを減らします。
2番目の引数 freq は2つの目的を持っています。
-機能 1-3、それは頻度を表し、サーフェイスを覆うバンプ分布のグローバルサイズをコントロールします。より大きな値はより小さなバンプを生成します。

-機能 4、それは波長を表し、ripples間で要求されたスペースの量を設定します。より大きな波長値はより近い波を生成し、一方より小さな値はより広い間隔のものを生成します。

Phaseは機能 3のみで使用され、カレントフレームのための波の位相を設定します。
アニメーションの連続したフレームのために小さい量で phase を変更する事により、波は移動しているように見えます。

シンタックスは:
 
Phase float ph
 
 

3.13.3.5 Example of a pattern surface

 
ここにこのセクションで記述したほとんど全ての指令を含んでいるパターンサーフェイスに基いたシェーダ定義の例があります。

Declare pattern = Shader [ PatternSurface [
    PatternModifiers(3,4,1)
    Turbulence 0.5
    Octaves 3
    Bumpiness (0.75, 4)
    Kd 0.75
    Ks 0.2
    PhongSpecularBRDF 5
    SpectrumOfColors(
        [0.000, '0.784, 0.627, 0.522', 0.053, '0.784, 0.627, 0.624']
        [0.053, '0.784, 0.627, 0.624', 0.263, '0.824, 0.557, 0.376']
        [0.263, '0.824, 0.557, 0.376', 0.281, '0.643, 0.380, 0.376']
        [0.281, '0.643, 0.380, 0.376', 0.325, '0.839, 0.722, 0.722']
        [0.325, '0.839, 0.722, 0.722', 0.711, '0.784, 0.627, 0.522']
        [0.711, '0.784, 0.627, 0.522', 0.798, '0.769, 0.380, 0.376']
        [0.798, '0.769, 0.380, 0.376', 0.895, '0.824, 0.557, 0.376']
        [0.895, '0.824, 0.557, 0.376', 0.982, '0.784, 0.627, 0.522']
        [0.982, '0.784, 0.627, 0.522', 1.001, '0.784, 0.627, 0.522'])
  ]
  Scale (0.5, 0.5, 0.5)
]
 





next