虹圩の暡倣シェヌダヌCD-ROM

このチュヌトリアルでは、 iridiscenceに぀いお説明したす。 このチュヌトリアルでは、色の反射を䜜成するマテリアルの動䜜を理解し、再珟するために、光の本質を探りたす。 このチュヌトリアルはUnityのゲヌム開発者を察象ずしおいたすが、このチュヌトリアルで説明する手法は、UnrealやWebGLなどの他の蚀語で簡単に実装できたす。


チュヌトリアルは、次のパヌトで構成されたす。


はじめに


Iridiscenceは、光の角床や芖野角が倉化するずオブゞェクトの色が倉化する光孊珟象です。 この効果のおかげで、泡には非垞に幅広い色のパレットがありたす。


虹色は、流出したガ゜リンのプヌル、CD-ROMの衚面、さらには新鮮な肉にも珟れたす。 倚くの昆虫や動物は、虹圩を䜿甚しお、適切な色玠なしで花を䜜りたす。


これは、これらすべおのオブゞェクトの衚面にある光ず埮现構造の盞互䜜甚により虹圩が発生するためです。 昆虫の倖郚骚栌のCD-ROMトラックずフレヌク䞋の画像を参照は、盞互䜜甚する光の波長ず同皋床の倧きさを持っおいたす。 実際、虹圩は光の真の波動性を明らかにした最初の珟象でした。 私たちは、光が䜕であるか、どのように機胜し、人間の目でどのように知芚されるかを最初に理解するこずなく、虹圩を説明し再珟するこずはできたせん。




光の性質


倚くの亜原子粒子ず同様に、光は粒子ず波の特性を同時に瀺したす。 倚くの堎合、光は1番目たたは2番目ずしおモデル化されたす。 ほずんどのアプリケヌションでは、光は光子ず呌ばれる数兆個の個々の粒子で構成されおいるず考えるこずができたす。 たずえば、ほずんどのシェヌダヌは、フォトンが小さなビリダヌドボヌルのように振る舞い、衝突した角床で​​オブゞェクトから反射されるず考えおいたす䞋図を参照。


しかし、光は波ずしおもモデル化できたす。 物理孊者はこの抂念に粟通しおいたすが、開発者は垞にそれを認識しおいるわけではありたせん。 それでは、光が波の圢で存圚するこずの意味を理解するのに時間をかけたしょう。

私たちは皆海の波を知っおいたす。 海面䞊の各ポむントには高さがありたす。 平均倀が高いほど、波は高くなりたす。 氎面を乱すず、波ぱネルギヌが消散するたで海を䌝播し始めたす。

光は波ですが、氎面䞊の高さずしお枬定するのではなく、 電磁堎が目的のポむントで持っおいる゚ネルギヌずしお定矩されたす。 このモデルによるず、光は空間を䌝播する電磁堎の摂動です。 波を䜜るか、呚囲の空間に倚くの光子を攟出する電球を想像できたす。

光子によっお䌝達される゚ネルギヌの量によっお、光の色が決たりたす。 䜎゚ネルギヌの光子は赀ず認識されたす。 高゚ネルギヌの光子は玫色ずしお認識されたす。 波には、粒子゚ネルギヌに䌌た特性がありたす 波長 。 盎感的な理解のために、これは波の2぀のピヌク間の距離であるず蚀えたす。


光は垞に同じ速床毎秒玄299,792,458メヌトルで移動したす。぀たり、電磁波は同じ速床で䌝播したす。 速床は䞀定ですが、波長は異なる堎合がありたす。 高゚ネルギヌ光子は短波長です。 最終的に色を決定するのは光の波長です。


䞊の図でわかるように、人間の目は、玄700ナノメヌトルから400ナノメヌトルの範囲の波長の光子を知芚できたす。 ナノメヌトルはメヌトルの10億分の1です。

ナノメヌトルはどれくらい小さいですか
自然が機胜する最小のスケヌルを把握しようずするずき、議論された次元を想像するこずは困難です。 平均的な人の身長は玄1.6メヌトルです。 人間の髪の毛の倪さは玄50 マむクロメヌトル 50ミクロンです。 マむクロメヌトルは、100䞇分の1メヌトルです1ÎŒm= 0.000001メヌトル= 10−6メヌタヌ。 ナノメヌトルはマむクロメヌトルの1000分の1です1 nm = 0.000000001メヌトル= 10−9メヌタヌ。 ぀たり、可芖光の波長は、人間の髪の毛の玄100分の1です。

次は

チュヌトリアルの残りの郚分でこの簡単な玹介をした埌、iridiscenceずそのUnityでの実装の理解に焊点を圓おたす。


たずめるず


このセクションから、iridiscenceチュヌトリアルを開始したした。 この蚘事の残りの郚分では、泡からCD-ROM、流出したガ゜リンから昆虫に至るたで、さたざたな玠材での無圩な反射をシミュレヌトしお実珟する方法を探りたす。

パヌト2.虹の改善-1。


フォトリアリズムの䞖界ぞの旅には、光がどのように機胜するかだけでなく、色をどのように知芚するかを理解する必芁がありたす。 虹にはいく぀の色がありたすか なぜピンクが含たれおいないのですか ここでは、このパヌトで取り䞊げる問題の䞀郚を玹介したす。


はじめに


このパヌトでは、虹色を再珟するためにコンピュヌタヌグラフィックスで䜿甚される最も䞀般的な手法に぀いお孊びたす。 これは無駄な運動のように思えるかもしれたせんが、実際には非垞に実甚的です。 虹の各色は、光の特定の波長に察応しおいたす。 このような適合により、物理的に有効な反射をシミュレヌトできたす。

次の「Improving the Rainbow-2」では、シェヌダヌに最適化され、同時に珟時点で最良の結果を生み出す新しいアプロヌチを玹介したす以䞋を参照。

このチュヌトリアルで説明したすべおの手法のWebGLバヌゞョンの比范は、 Shadertoyにありたす。

花の知芚


網膜は、光を認識する目の郚分です。 特定の波長の光を認識するず脳に信号を䌝達できる錐䜓现胞がありたす。 光は電磁界内の波なので、コヌンは電波を認識するのず同じ原理に埓っお機胜したす。 デファクトコヌンは小さなアンテナです。 ゚レクトロニクスを研究したこずがある堎合、アンテナの長さはピックアップする波長に関係しおいるこずを知っおおく必芁がありたす。 それが人間の目には3皮類の錐䜓が存圚する理由です短、䞭、長。 各タむプは、特定の波長範囲の認識に特化しおいたす。


䞊蚘のグラフは、各タむプのコヌンが異なる波長にどのように反応するかを瀺しおいたす。 これらのタむプのコヌンの1぀がアクティブになるず、脳はその信号を色ずしお解釈したす。 これはよく蚀われたすが、短い、䞭皋床、長い円錐は特定の色に察応しおいたせん。 より具䜓的には、各タむプは異なる色範囲に察しお異なる反応を瀺したす。

短、​​䞭、長の円錐が青、緑、赀を認識するず仮定するのは間違っおいたす。 これにもかかわらず、倚くの教科曞およびシェヌダヌもは、このかなり耇雑な珟象の比范的蚱容可胜な近䌌を䜜成するためにこの仮定を行いたす。

スペクトル色


無差別を可胜にする物理珟象を再珟したい堎合は、コンピュヌタヌで色を保存および凊理する方法を再考する必芁がありたす。 Unityたたは他のゲヌム゚ンゞンで光源を䜜成するずき、赀、緑、青の3぀の䞻芁コンポヌネントの混合ずしお色を蚭定できたす。 赀、緑、青の組み合わせは実際にすべおの可芖色を䜜成できたすが、最も基本的なレベルでは、光の働きは異なりたす。

光源は、䞀定の光子束ずしおモデル化できたす。 異なる量の゚ネルギヌを運ぶ光子は、私たちの目には異なる色ずしお知芚されたす。 ただし、「癜色光子」は存圚したせん。 これは倚くの光子の合蚈であり、それぞれが異なる波長を持ち、光に癜色を䞎えたす。

先に進むには、光自䜓の「ビルディングブロック」に぀いお話す必芁がありたす。 「波長」に぀いお話すずきは、虹の特定の色に぀いお考える䟡倀がありたす。 このパヌトでは、この接続を実装するさたざたなアプロヌチを瀺したす。 結果ずしお、䞎えられた色に察しお知芚された色を返す関数を取埗したい

fixed3 spectralColor (float wavelength); 

ポストの残りでは、波長をナノメヌトル10億分の1メヌトルで衚したす。 人間の目は、400 nm〜700 nmの範囲の光を知芚できたす。 この範囲倖の波長は存圚したすが、色ずしお認識されたせん。

最適な゜リュヌションがないのはなぜですか
Earl F. Glynnがこの質問に最もよく答えたした。
「波長ずRGB倀の間には䞀意の察応関係はありたせん。 色は、物理孊ず人間の知芚の驚くべき組み合わせです。」

波長ず色の最終的に正しい察応の怜玢は、必然的に倱敗に終わりたす 。 光の性質は客芳的ですが、私たちの知芚はそうではありたせん。 可芖スペクトルの特定の波長を知芚するコヌンは、人によっお倧きく異なりたす。 すべおの錐䜓がすべおの人々に察しお同じで䞀定であるず仮定したずしおも、それらの分垃ず網膜内の数はほずんどランダムです。 1人であっおも、2぀の網膜は同じではありたせん。

最埌に、色の知芚は、脳がこの入力をどのように知芚するかに䟝存したす。 このため、さたざたな錯芚や神経適応が生じ、色の知芚をナニヌクで真に個人的な䜓隓にしたす。

スペクトルマップ


䞋の図は、長さが400ナノメヌトル青から700ナノメヌトル赀の範囲の波を人間の目がどのように知芚するかを瀺しおいたす。


可芖スペクトルの色の分垃が非垞に非線圢であるこずは簡単にわかりたす。 各波長のグラフに知芚色の察応する成分R、G、Bをプロットするず、結果ずしお同様の結果が埗られたす。


この曲線を完党に説明できる単玔な関数はありたせん。 最も単玔で安䟡な実装アプロヌチは、色に波長を付加する手段ずしおシェヌダヌでこのテクスチャを䜿甚するこずです。

最初に行うこずは、シェヌダヌに新しいテクスチャぞのアクセスを提䟛するこずです。 これを行うには、新しいシェヌダヌのPropertiesブロックにテクスチャプロパティを远加しProperties 。

 //  Properties { ... _SpectralTex("Spectral Map (RGB)",2D) = "white" {} ... } //   SubShader { ... CGPROGRAM ... sampler2D _SpectralTex; ... ENDCG ... } 

spectrumColor関数は、間隔[400,700]の波長を単に間隔[0,1]のUV座暙に倉換したす。

 fixed3 spectral_tex (float wavelength) { //  : [400, 700] // u: [0, 1] fixed u = (wavelength -400.0) / 300.0; return tex2D(_SpectralTex, fixed2(u, 0.5)); } 

特定のケヌスでは、波長を間隔[400、700]に匷制的に制限する必芁はありたせん。 RepeatClampを䜿甚しおスペクトルテクスチャをむンポヌトするず、この範囲倖のすべおの倀は自動的に黒になりたす。

ルヌプテクスチャサンプリング
以䞋で、虹圩の効果を再珟するには、虹からいく぀かの色をサンプリングする必芁があるこずがわかりたす。 䞀郚のデバむスでは、シェヌダヌがルヌプ内のテクスチャのサンプリングをサポヌトしおいない堎合がありたす。 これは、特にモバむルプラットフォヌムでは、テクスチャを䜿甚するこずが最善のアプロヌチではない可胜性がある最も重芁な理由です。

JETカラヌスキヌム


テクスチャのサンプリングは良いアむデアのように思えるかもしれたせん。 ただし、シェヌダヌの速床が倧幅に䜎䞋する可胜性がありたす。 各ピクセルが耇数のテクスチャサンプルを必芁ずするCD-ROMの無差別性の芳点から、これがどれほど重芁であるかがわかりたす。

光スペクトルの色分垃を近䌌する関数がいく぀かありたす。 おそらく最も簡単なものの1぀は、JETカラヌスキヌムです。 この配色は、MATLABで既定で䜿甚され、宇宙物理孊における流䜓ゞェットのシミュレヌションの芖芚化を改善するために、元は囜立スヌパヌコンピュヌタヌアプリケヌションセンタヌによっお開発されたした。


JETカラヌスキヌムは、青、緑、赀の3぀の異なる曲線の組み合わせです。 これは、色を分割するずきにはっきりず芋られたす。


䞊蚘のスキヌムを構成する線の方皋匏を蚘述するこずにより、JETカラヌスキヌムを自分で簡単に実装できたす。

 //   MATLAB Jet fixed3 spectral_jet(float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/300.0); fixed3 c; if (x < 0.25) c = fixed3(0.0, 4.0 * x, 1.0); else if (x < 0.5) c = fixed3(0.0, 1.0, 1.0 + 4.0 * (0.25 - x)); else if (x < 0.75) c = fixed3(4.0 * (x - 0.5), 1.0, 0.0); else c = fixed3(1.0, 1.0 + 4.0 * (0.75 - x), 0.0); //     [0,1] return saturate(c); } 

結果の色のR、G、およびBの倀は、Cg saturate関数を䜿甚しお間隔[0.1]に制限されたす。 カメラに察しおHDR ハむダむナミックレンゞレンダリング が遞択されおいる堎合、これは、1より倧きいコンポヌネントの色の存圚を避けるために必芁です。

JETカラヌスキヌムを厳密に遵守したい堎合、可芖範囲倖の倀は黒にならないこずに泚意しおください。

ブルヌトンの配色


波長を可芖色に倉換する別のアプロヌチは、Dan Brutonの蚘事「 Visible RGB values for Visible Wavelengths 」で提案されたスキヌムです。 JETカラヌスキヌムで起こるこずず同様に、Brutonは知芚された色のおおよその分垃から始たりたす。


しかし、圌のアプロヌチは長い円錐の掻動をよりよく近䌌しおおり、可芖スペクトルの䞋郚に匷い玫の陰圱をもたらしたす。


このアプロヌチは、次のコヌドに倉換されたす。

 //   fixed3 spectral_bruton (float w) { fixed3 c; if (w >= 380 && w < 440) c = fixed3 ( -(w - 440.) / (440. - 380.), 0.0, 1.0 ); else if (w >= 440 && w < 490) c = fixed3 ( 0.0, (w - 440.) / (490. - 440.), 1.0 ); else if (w >= 490 && w < 510) c = fixed3 ( 0.0, 1.0, -(w - 510.) / (510. - 490.) ); else if (w >= 510 && w < 580) c = fixed3 ( (w - 510.) / (580. - 510.), 1.0, 0.0 ); else if (w >= 580 && w < 645) c = fixed3 ( 1.0, -(w - 645.) / (645. - 580.), 0.0 ); else if (w >= 645 && w <= 780) c = fixed3 ( 1.0, 0.0, 0.0 ); else c = fixed3 ( 0.0, 0.0, 0.0 ); return saturate(c); } 

カラヌスキヌムバンプ


JETずBrutonの配色は、䞍連続関数を䜿甚したす。 したがっお、非垞にシャヌプなカラヌバリ゚ヌションが䜜成されたす。 たた、可芖範囲倖では、黒になりたせん。 本「GPU Gems」では、この問題は以前の配色の厳しいラむンをより滑らかなバンプに眮き換えるこずで解決されおいたす。 各ベンドは、次の圢匏の芏則的な攟物線です。 y=1−x2。 より具䜓的に

bump \ leftx \ right= \ left \ {\ begin {matrix} 0\ left | x \ right |> 1 \\ 1-x ^ 2\ mathit {otherwise} \ end {matrix} \ right ã€‚


スキヌムの䜜成者であるRandima Fernandoは、次のように配眮されたすべおのコンポヌネントに攟物線を䜿甚したす。



次のコヌドを曞くこずができたす。

 // GPU Gems inline fixed3 bump3 (fixed3 x) { float3 y = 1 - x * x; y = max(y, 0); return y; } fixed3 spectral_gems (float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/300.0); return bump3 ( fixed3 ( 4 * (x - 0.75), // Red 4 * (x - 0.5), // Green 4 * (x - 0.25) // Blue ) ); } 

この配色のもう1぀の利点は、テクスチャサンプルず分岐を䜿甚しないこずです。これは、品質よりも速床を優先する堎合に最適な゜リュヌションの1぀になりたす。 このチュヌトリアルの最埌に、この配色の改蚂版を瀺したす。これにより、高解像床の色を維持しながら、より高速になりたす。

スペクタヌの配色


最も正確な配色の1぀は、ナヌザヌStack Overflow Spektreによっお䜜成されたものです。 圌は、 可芖スペクトルポストのRGB倀で圌の方法論を説明し、倪陜スペクトルから材料デヌタの青、緑、赀の成分をサンプリングしたす。 その埌、単玔な関数で個々の間隔を埋めたす。 結果を次の図に瀺したす。


提䟛するもの


そしお、ここにコヌドがありたす

 // Spektre fixed3 spectral_spektre (float l) { float r=0.0,g=0.0,b=0.0; if ((l>=400.0)&&(l<410.0)) { float t=(l-400.0)/(410.0-400.0); r= +(0.33*t)-(0.20*t*t); } else if ((l>=410.0)&&(l<475.0)) { float t=(l-410.0)/(475.0-410.0); r=0.14 -(0.13*t*t); } else if ((l>=545.0)&&(l<595.0)) { float t=(l-545.0)/(595.0-545.0); r= +(1.98*t)-( t*t); } else if ((l>=595.0)&&(l<650.0)) { float t=(l-595.0)/(650.0-595.0); r=0.98+(0.06*t)-(0.40*t*t); } else if ((l>=650.0)&&(l<700.0)) { float t=(l-650.0)/(700.0-650.0); r=0.65-(0.84*t)+(0.20*t*t); } if ((l>=415.0)&&(l<475.0)) { float t=(l-415.0)/(475.0-415.0); g= +(0.80*t*t); } else if ((l>=475.0)&&(l<590.0)) { float t=(l-475.0)/(590.0-475.0); g=0.8 +(0.76*t)-(0.80*t*t); } else if ((l>=585.0)&&(l<639.0)) { float t=(l-585.0)/(639.0-585.0); g=0.82-(0.80*t) ; } if ((l>=400.0)&&(l<475.0)) { float t=(l-400.0)/(475.0-400.0); b= +(2.20*t)-(1.50*t*t); } else if ((l>=475.0)&&(l<560.0)) { float t=(l-475.0)/(560.0-475.0); b=0.7 -( t)+(0.30*t*t); } return fixed3(r,g,b); } 

おわりに


このパヌトでは、シェヌダヌで虹のようなパタヌンを生成するための最も䞀般的な手法をいく぀か芋おきたした。 次のパヌトでは、この問題を解決するための新しいアプロヌチを玹介したす。

圹職募配
ゞェット機
ブルヌトン
GPUゞェム
スペクタヌ
ズッコニ
ズッコニ6
可芖スペクトル

パヌト3.虹の改善-2。


はじめに


前のパヌトでは、電磁スペクトルの可芖範囲400〜700ナノメヌトルの波長をそれぞれの色に倉換する4぀の異なる方法を分析したした。

これらの゜リュヌションのうち3぀JET、Bruton、およびSpektreはif構造を積極的に䜿甚したす。 これはCの暙準的な手法ですが、シェヌダヌでは分岐は悪いアプロヌチです。 分岐を䜿甚しない唯䞀のアプロヌチは、GPU Gemsブックで説明されおいるアプロヌチです。 ただし、可芖スペクトルの色の最適な近䌌倀は提䟛されたせん。

圹職募配
GPUゞェム
可芖スペクトル

このパヌトでは、GPU Gemsずいう本で説明されおいるカラヌスキヌムの最適化バヌゞョンに぀いお説明したす。

バンプカラヌスキヌム


GPU Gemsブックで抂説されおいる元のカラヌスキヌムは、3぀の攟物線著者によっおバンプず呌ばれたす を䜿甚しお、虹色のR、G、およびBコンポヌネントの分垃を再珟したす。


各バンプは、次の匏で蚘述されたす。

bump \ leftx \ right= \ left \ {\ begin {matrix} 0\ left | x \ right |> 1 \\ 1-x ^ 2\ mathit {otherwise} \ end {matrix} \ right ã€‚


各波長 w範囲[400、700]は、正芏化された倀にマッピングされたす x間隔[0,1]で。 次に、可芖スペクトルの成分R、G、Bを次のように定矩したす。

R\巊x\右=バンプ\巊4 cdotx−0.75\右



G\巊x\右=バンプ\巊4 cdotx−0.5\右



B\巊x\右=バンプ\巊4 cdotx−0.25\右


すべおの数倀は、実隓的に著者によっお遞択されおいたす。 ただし、実際の色の分垃にどれだけ察応しおいないかがわかりたす。


品質の最適化


私が最初に思い぀いた解決策では、GPU Gemsのカラヌスキヌムずたったく同じ方皋匏が䜿甚されたした。 ただし、すべおの数倀を最適化しお、最終的な色の範囲が可胜な限り可芖スペクトルの実際の色ず䞀臎するようにしたした。

結果は、次の゜リュヌションに芁玄されたす。


そしお、より珟実的な結果に぀ながりたす。

圹職募配
GPUゞェム
ズッコニ
可芖スペクトル

元の゜リュヌションず同様に、新しいアプロヌチには分岐が含たれおいたせん。 したがっお、シェヌダヌに最適です。 コヌドは次のずおりです。

 //     GPU Gems //    inline fixed3 bump3y (fixed3 x, fixed3 yoffset) { float3 y = 1 - x * x; y = saturate(y-yoffset); return y; } fixed3 spectral_zucconi (float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/ 300.0); const float3 cs = float3(3.54541723, 2.86670055, 2.29421995); const float3 xs = float3(0.69548916, 0.49416934, 0.28269708); const float3 ys = float3(0.02320775, 0.15936245, 0.53520021); return bump3y ( cs * (x - xs), ys); } 

あなたの決定に぀いおもっず教えおください
最適化アルゎリズムを芋぀けるために、Python scikitラむブラリヌを䜿甚したした。

結果を再珟するために必芁なオプションは次のずおりです。

  • アルゎリズムL-BFGS-B
  • 公差 1 cdot10−8
  • 反埩 1 cdot108
  • 加重MSE
    • WR=0.3
    • WG=0.59
    • WB=0.11
  • フィッティング
  • 元の゜リュヌション
    • CR=4
    • CG=4
    • CB=4
    • XR=0.75
    • XG=0.5
    • XB=0.25
    • YR=0
    • YG=0
    • YB=0
  • 最終的な解決策
    • CR=3.54541723
    • CG=2.86670055
    • CB=2.29421995
    • XR=0.69548916
    • XG=0.49416934
    • XB=0.28269708
    • YR=0.02320775
    • YG=0.15936245
    • YB=0.53520021

虹の改善


可芖スペクトルの色の分垃を詳しく芋るず、攟物線は実際にはR、G、Bの色曲線を繰り返すこずができないこずに気付くでしょう。3぀ではなく6぀の攟物線を䜿甚する方が良いでしょう。 各メむンコンポヌネントに2぀のバンプを取り付けるこずにより、より正確な近䌌が埗られたす。 違いは、スペクトルの玫色の郚分で非垞に顕著です。


違いは、スペクトルの玫ずオレンゞの郚分ではっきりず芋えたす。

圹職募配
ズッコニ
ズッコニ6
可芖スペクトル

コヌドは次のようになりたす。

 //     GPU Gems //    fixed3 spectral_zucconi6 (float w) { // w: [400, 700] // x: [0, 1] fixed x = saturate((w - 400.0)/ 300.0); const float3 c1 = float3(3.54585104, 2.93225262, 2.41593945); const float3 x1 = float3(0.69549072, 0.49228336, 0.27699880); const float3 y1 = float3(0.02312639, 0.15225084, 0.52607955); const float3 c2 = float3(3.90307140, 3.21182957, 3.96587128); const float3 x2 = float3(0.11748627, 0.86755042, 0.66077860); const float3 y2 = float3(0.84897130, 0.88445281, 0.73949448); return bump3y(c1 * (x - x1), y1) + bump3y(c2 * (x - x2), y2) ; } 

spectrum_zucconi6が分岐せずに優れた色近䌌を提䟛するこずは間違いありたせん。 速床が重芁な堎合は、アルゎリズムの簡易バヌゞョン-spectrum_zucconiを䜿甚できたす。

たずめるず


このパヌトでは、シェヌダヌで虹のようなパタヌンを生成する新しいアプロヌチを怜蚎したした。

圹職募配
ゞェット機
ブルヌトン
GPUゞェム
スペクタヌ
ズッコニ
ズッコニ6
可芖スペクトル

パヌト4.回折栌子を理解する


チュヌトリアルの最初の郚分では、波ず粒子の特性を瀺す光の二重の性質に粟通したした。 このパヌトでは、なぜこれら2぀の偎面の䞡方が無差別の発生に必芁であるかを芋おいきたす。

反射光ず鏡


科孊文献では、 光線は 、宇宙空間で光子が移動し、物䜓ず盞互䜜甚する経路を瀺す方法ずしおしばしば蚀及されおいたす。 ほずんどのシェヌディングモデルでは、光は、完璧なビリダヌドボヌルのように振る舞う均質な粒子から生成されるず認識されたす。 䞀般的な堎合、光線が衚面に衝突するず、同じ偏向角で反射したす。 そのような衚面は完党な鏡のように振る舞い、光を完党に反射したす。


この手法を䜿甚しおレンダリングされたオブゞェクトは、ミラヌのようなものです。 さらに、光がL方向から萜ちた堎合、芳察者はR方向から芋たずきにのみそれを芋るこずができたす。 このタむプの反射は鏡面反射ずも呌ばれ、鏡のような意味です。

珟実の䞖界では、ほずんどのオブゞェクトは拡散ず呌ばれる異なる方法で光を反射したす。 光線が散乱面に圓たるず、ほがすべおの方向に均䞀に散乱されたす。 これにより、オブゞェクトに均䞀な拡散色が䞎えられたす。


最新の゚ンゞンUnityやUnrealなどでは、これら2぀の動䜜は異なる方皋匏のセットを䜿甚しおモデル化されたす。 前回の物理ベヌスのレンダリングず照明モデルのチュヌトリアルでは、拡散反射ず鏡面反射にそれぞれ䜿甚されるランバヌト 反射モデルずブリンフォン 反射モデルに぀いお説明したした。

異なっお芋えるずいう事実にもかかわらず、拡散反射はミラヌを通しお説明できたす。 完党に平らな衚面はありたせん。 小さな鏡から䜜成された粗い衚面をシミュレヌトできたす。各鏡は鏡面反射率によっお完党に特城付けられたす。 そのような埮小面の存圚は、あらゆる方向の光線の散乱をもたらしたす。


このようなマむクロファセットの倚方向性は、倚くの堎合、 SmoothnessやRoughnessなどのプロパティを䜿甚した物理的に正確なシェヌダヌによっおモデル化されたす。 この詳现に぀いおは、Unityヘルプペヌゞで暙準゚ンゞンシェヌダヌのSmoothnessプロパティに぀いお説明しおいたす。


反射率はどうですか
このセクションでは、拡散拡散反射は、倚方向の埮小面で構成される衚面での鏡面反射を考慮するこずで完党に説明できるず述べたした。 ただし、これは完党に真実ではありたせん。 衚面が鏡面反射のみを瀺す堎合、これは完党に研磚するず黒く芋えるこずを意味したす。 癜い倧理石は良い反䟋ず考えるこずができたす。研磚しないず黒くなりたせん。 完党に滑らかな衚面を達成できたずしおも、癜い倧理石はただ癜い拡散反射成分を瀺したす。

そしお実際、この効果には他の䜕かが関䞎しおいたす。 衚面の拡散成分は、副次的な゜ヌスである屈折からも発生したす。 光はオブゞェクトの衚面を透過し、その内郚で反射され、異なる角床で出るこずができたす䞊の図を参照。 これは、すべおの入射光の䞀定の割合が、任意のポむントおよび任意の角床で材料の衚面によっお再攟射されるこずを意味したす。 この振る舞いはしばしば衚面䞋散乱ず呌ばれ、それをシミュレヌトするための蚈算はしばしば非垞にコストがかかりたす。

これらの効果およびシミュレヌションの詳现に぀いおは、マヌモセットの物理ベヌスレンダリングの基本理論を参照しおください 。

光は波のようです


光線がパヌティクルで構成されおいるかのようにシミュレヌトするこずは非垞に䟿利です。 ただし、これにより、無差別を含む倚くの資料を瀺す動䜜を再珟するこずはできたせん。 特定の条件の光が波のように振る舞うずいう事実を受け入れた堎合にのみ、いく぀かの珟象を完党に理解するこずができたす。

ほずんどのシェヌダヌは、光をパヌティクルずしお䜿甚したす。 この倧幅な簡玠化の結果、 远加の構成が行われたす。 2぀の光線が芳枬者に到達した堎合、それらの明るさは単玔に加算されたす。 サヌフェスが攟射する光線が倚いほど、明るくなりたす。

珟実の䞖界では、そうではありたせん。 2぀の光線が芳枬者に到達する堎合、最終的な色は、それらの波が盞互䜜甚する方法に䟝存したす。 以䞋のアニメヌションは、2぀の単玔な正匊波が䜍盞に応じお互いに増幅たたは盞殺 する方法を瀺しおいたす。

アニメヌション

2぀の波の䜍盞が䞀臎するず、そのピヌクず谷が理想的に䞀臎したす。この堎合、最終的な波が増幅されたす。 そうでなければ、圌らは文字通りお互いを砎壊するこずができたす。 これは、2぀の光線が正しい構成で芳枬者に圓たるず、芳枬者が光を受け取らないこずを意味したす。

波の盞互䜜甚は奇劙な原理のように芋えるかもしれたせん。 しかし、私たちは皆、日垞生掻でそれを経隓したした。 科孊の普及者であるデレク・ミュラヌは、これを圌のビデオ「The Original Double Slit Experiment 」で説明しおいたす。


しかし、これは光ず虹色にどのように関係しおいたすか 虹圩の理由は、異なる長さの光波の盞互䜜甚です。 䞀郚のマテリアルは、正しい方向にのみフォトンを反射し、特定の色を匷調し、他を砎壊したす。 この盞互䜜甚の結果ずしお、虹を芳察できたす。

回折


このパヌトの最初のセクションでは、光ず物質の盞互䜜甚のタむプの1぀である反射に぀いお孊習したした。 反射は、光が粒子ずしおモデル化されるずきに発生したす。 ただし、それを波のように扱うず、新しい䞀連の動䜜が発生したす。 それらの1぀は回折ず呌ばれたす。すべおの入射光が同じ角床で衚面に到達する堎合、これは平面波ず呌ばれたす。たずえば、Unityの指向性光源は平面波を䜜成したす。平面波がギャップを通過するず、次のアニメヌションに瀺すように屈折したす。

アニメヌション

光が2぀の異なるスリットを通過するず、2぀の新しい波面が生成されたす。そしお、䞊で蚀ったように、これらの新しい光波は互いに盞互䜜甚するこずができたす。以䞋のアニメヌションは、このようなスロットが2぀ある堎合のラむトの動䜜を瀺しおいたす。それらは実際に盞互䜜甚し、光線を増幅および消光するこずがわかりたす。

アニメヌション

今、私たちは、無差別の原因を議論するために必芁な基瀎をすべお持っおいたす。

回折栌子

平面波がスリットを通過するか、粗さに反射するず、屈折し、新しい球面波面が䜜成されたす。これは、拡散反射で発生するのず同様に、光がすべおの方向に散乱されるこずを意味したす。材料の衚面が均䞀でない堎合、結果ずしお生じる平面波はランダムに散乱され、顕埮鏡レベルで干枉パタヌンは発生したせん。

ただし、䞀郚の材料には、入射光の波長に匹敵するスケヌルで繰り返される衚面パタヌンがありたす。これが発生するず、パタヌンの再珟性により、回折波の前面のランダムではない盞互䜜甚が繰り返されたす。結果ずしお生じる盞互䜜甚は、巚芖的なレベルで芋るこずができる繰り返しの干枉パタヌンを䜜成したす。

䞊蚘の効果は回折栌子ず呌ばれたす。䞀郚の波長は倧幅に増幅され、他の波長は砎壊されたす。異なる波長が異なる色に察応するため、回折栌子は、いく぀かの色の反射がより顕著になるずいう事実に぀ながりたす。

このメカニズムは、繰り返しパタヌンを持぀衚面での虹圩の発生を提䟛したす。それらは自然界にしばしば芋られたす。昆虫の倖郚骚栌ず鳥の矜には、繰り返しパタヌンで敎列した顕埮鏡スケヌルが含たれおいたす。䞋の画像では、孔雀の矜の拡倧画像が衚瀺されおいたす。


たずめるず


チュヌトリアルの次の郚分では、特定の皮類の虹圩を数孊的にモデル化する方法を瀺したす。方皋匏を導出した埌、シェヌダヌで簡単に実装できたす。

パヌト5。回折栌子の数孊。


はじめに


前のパヌトでは、䞀郚の玠材で無差別が発生する理由に぀いお説明したした。これで、この珟象を数孊的にモデル化するために必芁なものがすべお揃いたした。既知の距離にわたっお繰り返される䞍均䞀性がある玠材を提瀺するこずから始めたしょうd 。 方皋匏を導き出すために、入射光線ず衚面法線の間の角床を次のように瀺したす。 ΞL。 たた、芳枬者がすべおの反射光線をある角床で受け取るように配眮されおいるこずを想像しおみたしょう ΞL。 それぞれの䞍均䞀性は光をすべおの方向に散乱させるため、芳察者には垞に関係なく光線が入射したす ΞL。


異質性は増分で定期的に繰り返されるため dナノメヌトル、その埌散乱パタヌン自䜓が繰り返されたす dナノメヌトル。これは、各スリットから少なくずも1぀の光線が芳枬者に到達するこずを意味したす。

方皋匏の導出


䞊図に瀺されおいる2぀の光線は、芳枬者に到達する前に異なる距離を進みたす。これらの2぀の光線の盞互䜜甚盞互の増幅たたは抑制を理解するために、芳枬者に到達したずきに䜍盞が䞀臎しない量を蚈算する必芁がありたす。

これらの2぀の光線は、最初の光線が衚面に圓たるたで䜍盞が完党に䞀臎したす。2番目のビヌムは䜙分な距離を移動したすx緑色で匷調衚瀺、その埌衚面にも萜ちたす。単玔な䞉角法を䜿甚しお、緑の線の長さがx 等しい d⋅sin⁡ΞL。


同様の構造を䜿甚しお、䜙分な距離を蚈算できたす y、2番目のビヌムが衚面に衝突するたで最初のビヌムを通過させたす。この堎合、次のこずがわかりたすy=d⋅sin⁡ΞV 。


これら2぀のセグメント x芳枬者が受信したずきに2぀のビヌムの䜍盞が䞀臎するかどうかを刀断するこずが重芁です。それらの違いは、これら2぀の光線の長さの違いを枬定したす。れロに等しい堎合、2぀の光線は本質的に同じ距離を通過しおいるため、2぀の光線の䜍盞が䞀臎しおいるこずが確実にわかりたす。

ただし、この堎合だけでなく、2぀の光線の䜍盞が䞀臎するこずもありたす。長さの差が波長の敎数倍である堎合wその埌、圌らはただ同盞になりたす。数孊的な芳点からは、2぀の光線が次の条件を満たす堎合、䜍盞が䞀臎したす。

dsin⁡ΞL−dsin⁡ΞV=n⋅w


sin⁡ΞL−sin⁡ΞV=n⋅wd


可芖化


この方皋匏の意味を理解するために少し時間を取りたしょう。光が斜めに萜ちた堎合ΞL 、材料を斜めから芋たずきに芳察者が芋るもの ΞV すべおの波長 w敎数倍であるこず d(sin⁡ΞL−sin⁡ΞV)、増幅ず盞互䜜甚し、最終反射に匷く珟れたす。したがっお、芖聎者に衚瀺されるのはこれらの色です。

この効果は、耇雑なアプロヌチの非垞に興味深い議論から取られた次の図によっお芖芚化されおいたすサむクルの虹色


癜い光線は、鏡面反射のために光子が続く経路をたどりたす。玠材をさたざたな角床から芋るず、円圢の虹暡様が芋えたす。各色はそれぞれの波長に察応し、順序によっお察応する党䜓が決たりたすn 。 ご芧のように、回折栌子方皋匏は負の倀でも満たされおいたす n量のため sin⁡ΞL−sin⁡ΞV負の倀になる堎合がありたす。蚈算の芳点からは、怜玢空間を単玔化しお、正の倀のみに制限するこずは理にかなっおいたすn 。 䜿甚する新しい方皋匏は次のずおりです。

|sin⁡ΞL−sin⁡ΞV|=n⋅wd


パヌト6. CD-ROMシェヌダヌ回折栌子-1


このパヌトでは、CD-ROMたたはDVDの衚面に芋える虹の反射を再珟するシェヌダヌの䜜成に぀いお説明したす。

はじめに


前のパヌトでは、いく぀かの衚面で瀺される虹圩反射の性質を蚘述する方皋匏を導き出したした。虹色は、衚面に繰り返しパタヌンが存圚する材料で発生し、そのサむズは、反射する光の波長に匹敵したす。

最終的に再珟したい光孊効果は、光源ず衚面法線の間の角床光の方向、芳察者の芖角芖方向、および繰り返されるギャップ間の距離の3぀の芁因に最終的に䟝存したす。


シェヌダヌは、暙準マテリアルが通垞䜜成する通垞の効果に虹色の反射を远加する必芁がありたす。そのため、Standard Surfaceシェヌダヌのラむティング機胜を 拡匵したす。この手順に慣れおいない堎合は、チュヌトリアルのPhysically Based Rendering and Lighting Modelsを勉匷する䟡倀がありたす。

衚面シェヌダヌの䜜成


最初のステップは、新しいシェヌダヌを䜜成するこずです。物理的に正確な照明を既にサポヌトしおいるシェヌダヌの機胜を拡匵したいので、暙準の衚面シェヌダヌから始めたしょう。


䜜成されたCD-ROMシェヌダヌには、新しいプロパティdistanceが必芁です。 d回折栌子方皋匏で䜿甚されたす。ブロックに远加しおみたしょうProperties。これは次のようになりたす。

 Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _Glossiness ("Smoothness", Range(0,1)) = 0.5 _Metallic ("Metallic", Range(0,1)) = 0.0 _Distance ("Grating distance", Range(0,10000)) = 1600 // nm } 

そこで、マテリアルむンスペクタヌに新しいスラむダヌを䜜成したす。ただし、プロパティ_Distanceはセクション内の倉数に関連付ける必芁がありたすCGPROGRAM。

 float _Distance; 

これで䜜業する準備ができたした。

照明機胜を倉曎する


最初に行う必芁があるのは、CD-ROMシェヌダヌのラむティング機胜を独自のものに眮き換えるこずです。#pragmaここでディレクティブを倉曎するこずでこれを行うこずができたす。

 #pragma surface surf Standard fullforwardshadows 

に

 #pragma surface surf Diffraction fullforwardshadows 

これにより、Unityはを呌び出した関数に照明蚈算を委任しLightingDiffractionたす。このサヌフェスシェヌダヌの機胜を拡匵し、再定矩しないこずを理解するこずが重芁です。そのため、新しい照明機胜は、暙準のUnity PBR照明機胜を呌び出すこずから始たりたす。

 #include "UnityPBSLighting.cginc" inline fixed4 LightingDiffraction(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) { //   fixed4 pbr = LightingStandard(s, viewDir, gi); // <    > return pbr; } 

䞊蚘のコヌドスニペットからわかるように、新しい関数はLightingDiffraction単にLightingStandardその倀を呌び出しお返したす。ここでシェヌダヌをコンパむルするず、マテリアルのレンダリング方法に違いは芋られたせん。

ただし、先に進む前に、グロヌバルむルミネヌションを凊理するための远加の関数を䜜成する必芁がありたす。この動䜜を倉曎する必芁がないため、新しいグロヌバルラむティング機胜は、暙準のUnity PBR機胜のプロキシ機胜にすぎたせん。

 void LightingDiffraction_GI(SurfaceOutputStandard s, UnityGIInput data, inout UnityGI gi) { LightingStandard_GI(s, data, gi); } 

たたLightingStandard、盎接䜿甚LightingDiffraction_GIするため、シェヌダヌに含める必芁があるこずにも泚意しおくださいUnityPBSLighting.cginc。

回折栌子の実装


これがシェヌダヌの基瀎になりたす。これで、前のパヌトで導出した回折栌子方皋匏を実装する準備が敎いたした。その䞭で、芳枬者はすべおの波長の合蚈である虹色の反射を芋るずいう結論に達したしたw栌子方皋匏を満たす

|sin⁡ΞL−sin⁡ΞV|=n⋅wd


どこで n-より倧きい敎数 0。

各ピクセルに぀いお、倀 ΞL光の方向によっお決定されたす、ΞVレビュヌの方向により決定およびdギャップ間の距離は既知です。未知の倉数はw そしお n。 最も簡単な方法は、倀をルヌプするこずです nどの波長が栌子方皋匏を満たすかを確認したす。

最終的な虹色反射に寄䞎する波長がわかったら、それらに察応する色を蚈算しお远加したす。「虹の改善」セクションでは、可芖スペクトルの波長を色に倉換するいく぀かの方法を怜蚎したした。spectral_zucconi6最小の蚈算コストで最良の近䌌を提䟛するため、このチュヌトリアルを䜿甚したす。

次の可胜な実装を芋おみたしょう。

 inline fixed4 LightingDiffraction(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) { //   fixed4 pbr = LightingStandard(s, viewDir, gi); //    fixed3 color = 0; for (int n = 1; n <= 8; n++) { float wavelength = abs(sin_thetaL - sin_thetaV) * d / n; color += spectral_zucconi6(wavelength); } color = saturate(color); //       pbr.rgb += color; return pbr; } 

このコヌドスニペットでは、倀を䜿甚したす nより良い結果を埗るために、より倧きな倀をずるこずができたすが、これはすでに虹色の反射の重芁な郚分を考慮するのに十分です。

私たちは最埌の巊-蚈算するsin_thetaLずsin_thetaV。これを行うには、別の抂念を導入する必芁がありたす接線ベクトルです。次のパヌトでは、その蚈算方法を孊びたす。

パヌト7.シェヌダヌCD-ROM回折栌子-2


はじめに


チュヌトリアルの前の郚分で、CD-ROMの衚面に珟れる虹色の反射の最初の近䌌を䜜成したした。このシェヌダヌは物理的に正しいこずを芚えおおくこずが重芁です。必芁な反射を正しくシミュレヌションするには、CD-ROMのすべおのトラックが円状に配眮されおいるこずを確認する必芁がありたす。これにより、攟射状の反射が䜜成されたす。

スロットの向き


導出したラティス方皋匏には倧きな制限がありたす。すべおのスロットが同じ方向に配眮されおいるこずを前提ずしおいたす。これは、倖郚の昆虫の骚栌によく圓おはたりたすが、CD-ROMの衚面のトラックは円圢に配眮されたす。゜リュヌションを文字通り実装するず、かなり説埗力のない反射が埗られたす画像の右偎。


この問題を解決するには、CD-ROMのスロットのロヌカル方向を考慮する必芁がありたす。すべおのスリットが同じ法線方向を持ち、ディスクの衚面に垂盎であるため、法線ベクトルを䜿甚しおも圹に立ちたせん。スリットの局所的な向きは、接線ベクトル䞊の画像の巊偎を䜿甚しお決定できたす。


䞊の図では、法線方向 N青で衚瀺され、接線の方向 T-赀。法線の方向で圢成される光源ず芳察者の角床N ず呌ばれおいたす ΞLそしお ΞV。 に䌌た角床 Tあれですか ΘLそしお ΘV。 䞊蚘のように、蚈算で䜿甚される堎合 ΞLそしお ΞVすべおのスリットが同じであるため、「フラットな」反射が埗られたす N。 䜿甚方法を芋぀ける必芁がありたす ΘLそしお ΘV、ロヌカル方向に正しく察応しおいるためです。

これたでのずころ、次のこずがわかっおいたす。

N⋅L=cos⁡ΞLN⋅V=cos⁡ΞV


T⋅L=cos⁡ΘLT⋅V=cos⁡ΘV


以来 Tそしお N垂盎である堎合、次のプロパティがありたす。

T⋅L=cos⁡ΘL=sin⁡ΞL


T⋅V=cos⁡ΘV=sin⁡ΞV


Cgはスカラヌ積のネむティブ実装を提䟛するため、これも非垞に䟿利です。蚈算するだけですT 。

コサむンはどこから来たのですか
: 1. . , — .

, . , . .

接線ベクトルの蚈算


シェヌダヌを終了するには、接線ベクトルを蚈算する必芁がありたす T。通垞、メッシュの䞊郚に盎接衚瀺されたす。ただし、CD-ROMの衚面がどれほど単玔かを考慮しお、自分で蚈算するこずができたす。このチュヌトリアルに瀺されおいるアプロヌチは非垞に単玔であり、CD-ROMメッシュの衚面に正しいUVスキャンがある堎合にのみ機胜するこずを考慮する䟡倀がありたす。


䞊の図は、接線の方向がどのように蚈算されるかを瀺しおいたす。ディスクの衚面は、座暙が0,0から1,1の範囲の四角圢ずしおUV珟像されるず想定されたす。これを知っお、CD-ROMの衚面䞊の各ポむントの座暙を-1、-1から+1、+ 1の範囲で再割り圓おしたす。この原理を基瀎ずしお、点の新しい座暙は䞭心から倖偎の方向にも察応しおいるこずがわかりたす緑の矢印。この方向を90床回転しお、CD-ROMの同心円状のトラック赀で衚瀺に接するベクトルを芋぀けるこずができたす。


surfUV座暙はラむティング関数では䜿甚できないため、これらの操䜜はシェヌダヌ関数で実行する必芁がありたすLightingDiffraction。

 // IN.uv_MainTex: [ 0, +1] // uv: [-1, +1] fixed2 uv = IN.uv_MainTex * 2 -1; fixed2 uv_orthogonal = normalize(uv); fixed3 uv_tangent = fixed3(-uv_orthogonal.y, 0, uv_orthogonal.x); 

蚈算された接線をオブゞェクトの空間からワヌルド空間に倉換するだけです。倉換では、オブゞェクトの䜍眮、回転、スケヌルが考慮されたす。

 worldTangent = normalize( mul(unity_ObjectToWorld, float4(uv_tangent, 0)) ); 

接線方向をラむティング関数に転送する方法は
LightingDiffraction . worldTangent, surf . , , .

, : . . worldTangent , surf LightingDiffraction .

座暙空間を切り替える方法は
. . .

, . , , , , unity_ObjectToWorld . Unity, _Object2World .

すべおをたずめる


これで、虹色の反射に察する色の効果を蚈算するために必芁なすべおができたした。

 inline fixed4 LightingDiffraction(SurfaceOutputStandard s, fixed3 viewDir, UnityGI gi) { //   fixed4 pbr = LightingStandard(s, viewDir, gi); // ---    --- float3 L = gi.light.dir; float3 V = viewDir; float3 T = worldTangent; float d = _Distance; float cos_ThetaL = dot(L, T); float cos_ThetaV = dot(V, T); float u = abs(cos_ThetaL - cos_ThetaV); if (u == 0) return pbr; //   fixed3 color = 0; for (int n = 1; n <= 8; n++) { float wavelength = u * d / n; color += spectral_zucconi6(wavelength); } color = saturate(color); //      pbr.rgb += color; return pbr; } 

これは虹ずどのように関係しおいたすか
wavelength , for, , .

( 400 700 ) . , .

« » , . , , spectral_zucconi6 . , GPU Gems .

Source: https://habr.com/ru/post/J346852/


All Articles