キラキラ効果を作成するにはどうすればよいですか?


9

リアルタイムシェーダーにきらびやかなエフェクトを作成しようとしていますが、方法がわかりません。

ここに一と別の例があります。

ここに画像の説明を入力してください

これを実装するにはどのようなテクニックを使用できますか?


これは、ブルームに似たポストプロセスエフェクトを介して実現できますが、ダウンサンプルフェーズにパターン(星のテクスチャ)を適用します。これはすべて推測にすぎません。
akaltar

1
法線および鏡面反射光マップでは、テクスチャを介してこれを実行できませんか?
JohnB 2014年

法線マップを使ってテストしました。しかし難しいのは、ビューの向きと光の向きに応じてキラキラ光らせることです。
MaT、2014年

回答:


10

さて、シェーダーを設計するように求められたら、まず小さな問題に分解することから始めるべきです。また、きらびやかな効果では実際にはシェーダーが美しく見えるわけではありませんが、全体的なライティングと効果は、そのうちの1つだけを使用してもそれほど美しくありません。

まず最初に、シェーダーの直接の一部ではないものについて説明しましょう。

  1. シャドウイングはシェーダーの一部ではなく、個別のシャドウイングパスを介して行われます。
  2. 私は仮定(質問に示されている。この画像は、特にリアルタイムレンダラを使用していないが、それが前提だ特にこと)アンビエントオクルージョンがあります。

次に、実際のシェーダーを個別のエフェクトに分解してみましょう。

  1. ライティングのような異方性があり、これはシェーダーの全体的な外観にとって非常に重要です。この背後にある理由は、実際の素材には生地が含まれているためです。これらの光沢のある生地は、光の反射に方向バイアスを与え、その特定の方向に反射光のを最大にします。

ここに画像の説明を入力してください

ここに画像の説明を入力してください このようなファブリックには無限に多くの法線がありますが、ここで説明する手法は、最も重要な法線に近似しています。

最も重要な法線を近似するための1つの方法は、Nを計算する代わりに、テクスチャ座標を使用してメッシュの接線を計算することです。L 1-(NT)を計算します。

ここで完全な説明。そして、おそらくそれを、それらが話す頂点テクニックではなく、フラグメントシェーダーに実装する必要があります。他の異方性モデルも適用できます。

きらびやかな効果のために:

これは、ワールドスペース/ローカルテクスチャスペース、またはスクリーンスペースで個別のパスとして実行できます。

私が考えることができるアルゴリズムは、画像処理技術を使用しています(メッシュにテクスチャ座標があると仮定しています)。

  • テクスチャ座標を使用してメッシュサーフェスに高周波2Dノイズを生成します。perlinノイズは良い候補のようです。
  • ノイズに3x3カーネルを使用して最大フィルターを適用します。これにより、下の画像のような効果が生成されますここでは、最大フィルターについて説明します

ここに画像の説明を入力してください

上記の画像はmaxフィルターの例にすぎず、ノイズに適用すると、スターフィールドに似たsthが得られます。

  • これを行ったら、ノイズに一定の偏差があるガウスフィルターを適用して、星のような形にします。

ここに画像の説明を入力してください

max(ed)ノイズに適用されたガウスフィルターの例。

  • 最後のステップは、これを元のメッシュテクスチャとライトと組み合わせることです。これは、元のメッシュテクスチャ/色で(|)または-ingバイナリ演算を使用して行うのが最適です。これにより、ノイズから白のみが取得され、黒のピクセルが削除されます。ライト(場合によっては他の鏡面反射光マップ)については、追加するか、以前に結合したピクセルで変調するのが最善の方法です。グローをより効果的にするには、グロー後処理エフェクトが必要な場合もあります。

この手法では、リアルタイムシェーダーの大幅な最適化が必要になる場合があります。


3

興味深い記事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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.