回答:
さて、シェーダーを設計するように求められたら、まず小さな問題に分解することから始めるべきです。また、きらびやかな効果では実際にはシェーダーが美しく見えるわけではありませんが、全体的なライティングと効果は、そのうちの1つだけを使用してもそれほど美しくありません。
まず最初に、シェーダーの直接の一部ではないものについて説明しましょう。
次に、実際のシェーダーを個別のエフェクトに分解してみましょう。
このようなファブリックには無限に多くの法線がありますが、ここで説明する手法は、最も重要な法線に近似しています。
最も重要な法線を近似するための1つの方法は、Nを計算する代わりに、テクスチャ座標を使用してメッシュの接線を計算することです。L 1-(NT)を計算します。
ここで完全な説明。そして、おそらくそれを、それらが話す頂点テクニックではなく、フラグメントシェーダーに実装する必要があります。他の異方性モデルも適用できます。
きらびやかな効果のために:
これは、ワールドスペース/ローカルテクスチャスペース、またはスクリーンスペースで個別のパスとして実行できます。
私が考えることができるアルゴリズムは、画像処理技術を使用しています(メッシュにテクスチャ座標があると仮定しています)。
上記の画像はmaxフィルターの例にすぎず、ノイズに適用すると、スターフィールドに似たsthが得られます。
max(ed)ノイズに適用されたガウスフィルターの例。
この手法では、リアルタイムシェーダーの大幅な最適化が必要になる場合があります。
興味深い記事AMD-Getting Proceduralがあります。
きらめきは思ったより難しいようです。
適切な解決策:3D位置を使用して3Dノイズ関数にインデックスを付け、ビューベクトルを追加し、frac関数を使用してさらにランダム化します。
Sparkle:
float specBase = saturate(dot(reflect(-normalize(viewVec), normal),
lightDir));
// Perturb a grid pattern with some noise and with the view-vector
// to let the glittering change with view.
float3 fp = frac(0.7 * pos + 9 * Noise3D( pos * 0.04).r + 0.1 * viewVec);
fp *= (1 - fp);
float glitter = saturate(1 - 7 * (fp.x + fp.y + fp.z));
float sparkle = glitter * pow(specBase, 1.5);