で、このオーバーウォッチゲームプレイ映像、キャラクターのシールドは、他のオブジェクトのジオメトリの近くにある地域で白点灯します。
床、壁、柱の近くの青いシールドの白い縁に注意してください。
シールドには独自のモデルがあり、効果はシェーダーで行われると思いますが、「近さ」の概念をシェーダープログラミングに変換する方法を理解しようとしていません。
で、このオーバーウォッチゲームプレイ映像、キャラクターのシールドは、他のオブジェクトのジオメトリの近くにある地域で白点灯します。
床、壁、柱の近くの青いシールドの白い縁に注意してください。
シールドには独自のモデルがあり、効果はシェーダーで行われると思いますが、「近さ」の概念をシェーダープログラミングに変換する方法を理解しようとしていません。
回答:
一般的な概要:
シールドなしでシーンの深度マップを作成します。いずれにしても、透明なオブジェクトは後のパスでレンダリングされることが多いため、これを無料で効果的に取得できます。それ以外の場合、深度サンダーを使用してRTTにシーンsansシールドをレンダリングすることにより、深度マップを作成できます。
通常、シーンをレンダリングし、深度マップをシールドシェーダーに渡します。
シェーダーで、シールドフラグメントの深さとシーンの深さの差を計算し、その差を使用してフラグメントの色を変更します。
フラグメントシェーダーコードを詳しく見ていきましょう。
float solidsDepth = texture2D(depthMap, gl_FragCoord.xy / dims).r;
すべてのフラグメントで深度マップをサンプリングします。フラグメントを画面スペース[0、width / height]から正規化された[0.0、1.0]座標に変換するために、ビューポートの次元で分割することを忘れないでください。この時点で、単にフラグメントの色をサンプリングされた深度マップピクセルに設定すると、次のようになります。
深度マップはグレースケールであるため、任意のチャネルから値を取得できます(r
ここで使用しました)。
float solidsDiff = 1.0 - smoothstep(
zNear,
zFar,
gl_FragCoord.z / gl_FragCoord.w
) - solidsDepth;
その後、その深度サンプルを使用して、シーンの深度とシールドフラグメントの深度の差を見つけることができます。また、深度を正規化し、[zNear、zFar](カメラの近接および遠方面)から[0.0、1.0]に移動することを忘れないでください。smoothstep
これをうまく行います。1.0 -
そのような値を反転することであるsolidsDiff
最小値(0.0)に- (zNear zFar)及び0.0の差が最大である場合1.0です。
solidsDepth
デプスマップを作成したデプスシェーダで既に正規化されていると想定していることに注意してください。
float alpha = 0.3 + max(0.0, 1.0 - log(100.0 * (solidsDiff - 0.005) + 1.0));
その後、深度の違いに応じてシールドのアルファチャネルを変更できます。ここでは、アルファの最小値から開始し、差に近づくにつれてアルファの素晴らしい急激な増加を0.3
作成します。0.0
- 0.005
オフセットは、単に「交差点」太くを作るために余白を追加します。変更してみてください!
gl_FragColor = vec4(vec3(1.0), alpha);
そして最後に、そのアルファをフラグメントの色に適用します。
湾曲したシールドを作成したり、「エネルギーシールド」の外観のためにプラズマを追加したり(デモ)、交差点だけを表示して効果を調べたりすることができます(デモ)。
空あなたのグラフィックカードは限界です!
どのエンジンを使用しているのかわかりません。または、使用している言語。それでも、オンラインで見つけることができるもののほとんどは、探しているものを実現するために、ある環境から別の環境に移植するのは難しくありません。
そして、あなたにとって役立つオンライン資料は確かにあります。Unityに関する次のディスカッションを参照してください:http ://www.superspacetrooper.com/2012/06/tutorial-force-field-weapon-impact-energy-dispersion/およびこの質問UE4関連:https://answers.unrealengine。コム/質問/ 74858 /ダイナミック力場-shader.html。完全なシェーダー例えば、Redditにはかなり最近の議論から、そのシールド効果を実装し、あなたが見ることができます:https://www.reddit.com/r/Unity3D/comments/3edi0n/does_any_one_knows_how_to_make_this_shield_effect/ されないが、チュートリアルのためにまさにその上、興味のあるものに十分関連しています:http : //www.nightbox-studios.com/2015/09/05/assets-shield-effect-scripts-for-texture3d-perlin-noise-shader/
また、このサイトで以前に作成された3つの関連する質問へのリンクもあります。これらは、達成したいことの背後にある概念を把握するのに非常に役立ちそうです。
Primative sphere問題を伴うXNAシールド効果
最後に、Unityとそれぞれの仮想ストアのUnreal Engineの両方にシールドシェーダーの素晴らしい実装がいくつかあります(これらのエンジンを使用している場合)。もちろん、通常は有料の資産ですが、購入後はほとんど常にオープンソースであり、頻繁に安価です。たまたまこれらのエンジンを使用していなくても、これらのアセットは、遊んだり学習したりするのに役立ちます。
それが役に立てば幸い。