夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

GraphicsToolsStandardShader機能解説

ここではGraphicsToolsStandardSaderで使用できる機能や使い方を解説します。

シェーダーを使用するうえですべての機能を知っている必要はありませんので知りたい機能を目次から選択ください。

〇基本機能

GraphicsToolsStandardShaderの基本機能はRenderingModeに加えMainMapsの項目になります。

 このブロックでマテリアルの基本的な見た目を構築することができます。

〇RenderingMode

 マテリアルの性質を設定します。

表示 説明  透明度
Opaque 透明度を持たない不透明なオブジェクトの描画を行う  ×
Cutout Png画像による切り抜きなど不透明、透明と描画を分ける  透明か不透明か
Fade 非物理学的な透明を行う  半透明も可能
Transparent 物理学的な透明を行う  半透明も可能
Additive エフェクトなどに使用するオーバーレイを行う  半透明も可能
Custom テンプレートから自身でカスタマイズする  半透明も可能

Opaque以外を選択している際に次のような警告が表示されることがあります。

 これは深度を取得するZWriteが有効になっていない場合に表示されるダイアログで、問題ない場合は無視をしてかまいません。

 FixNowを選択することでZWriteがオンになりますが、代わりにRenderingModeがCustomへと変わります。

・もっと詳しく

redhologerbera.hatenablog.com

〇CullMode(描画する面)

 Cullとはカリングを指し、描画の最適化にかかわる機能です。

メッシュには表面と裏面の向きの情報を保持しており、Cubeなどの立方体のようなシンプルの形の場合は通常表面のみが描画され、メッシュの裏面は見えることはありません。

 このような通常メッシュの表面のみが見え、裏面が見えないという3Dモデルを閉じたメッシュと呼ぶこともあります。

 このような場合透過率を持ったシェーダーのような特殊な場合を除いて裏面の描画計算は必要ありません。

 CullModeを指定することで指定した面を描画しないということができます。このため実際に描画される面はCullModeの反対の面になります。

◆CullMode Back

◆CullMode Front

◆CullMode Off

わかりやすくするためにFadeを使用して両面描画を確認しています

 ・もっとくわしく

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇Albedo(メイン色)

MainMapという表示の冒頭にはAlbedoと呼ばれるプロパティがあります。

 この値はメインとなる画像(テクスチャ)と色を指定できます。

〇AlphaFade/AlphaCutout(透明度の閾値)

AlphaCutoffはレンダリングモードがCutoutの場合、AlphaFadeはレンダリングモードがFade、Transparent、Additive、Customの場合に表示されます。

それぞれ透明度であるアルファ値の閾値を指しており、AlphaCutoffの場合指定した値より下のアルファ値を持つピクセルは破棄され透明になり、それ以上のアルファ値を持つピクセルは描画されるという仕組みになっています。

AlphaFadeは指定された透明度に応じて全体的な透過率が決まってきます。

〇ChannelMap(軽量な表現を行う)

ChannelMapはGraphicsTools StandardShader及びMRTK StandardShaderに特有の機能です。

ChannelMapを使用することで金属光沢(メタリック)、オクリュージョン、発光、スムースネスの4つの情報を制御できます。

 ChannelMapがあることによって本来であればメタリックマップ、オクリュージョンマップ、発光マップ、スムースネスマップの4つの画像が必要であるところを1つの画像にまとめてしまうことができ、GPU上での処理の軽量化を行っています。

 ChannnelMapではそれぞれの値をRGBAの画像の成分に割り振ることで実現しています。

・もっと詳しく

redhologerbera.hatenablog.com

ChannelMapの作成方法は以下で紹介しています。

redhologerbera.hatenablog.com

〇ノーマルマップ(質感やディティールアップ)

ノーマルマップはほかの一般的なシェーダーでもよく使用されるパラメータでノーマル=法線=面の向きの情報をカスタマイズする機能とその画像です。

 ノーマルマップを使用することでローポリゴンでありながら細かい凸凹を与えることや本来は存在しないディティールを与えて質感を向上させることができます。

 MRGT GraphicsTools StandardShaderではノーマルマップの強度をカスタマイズすることもできます。(v4.0以降のバージョンで使用できます。)

・もっと詳しく

準備中

〇Emission 発光

Emissionはその名の通り発光表現を行うことができます。

MRTK StandardShaderではEissionの機能は色と強度の情報だけを扱うことができ、対象のマテリアルを使用している部分全体が発光する仕様となっていましたが、GraphicsToolsStandardShaderではEmissionMapの機能が実装され、オプションで画像を指定することで細かく発光のパターンを変えることや一部のみが発光するようなマスク表現を行うことができるようになりました。

この機能実装には筆者が担当させていただいています。

・もっと詳しく

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

〇TriplanerMap(モデルのUVに依存しないテクスチャサンプリングを行う。)

TriplanerMapは例えば地面やSpatialMapで動的に張られたメッシュなどへ画像をサンプリングする際に使用されるオプションです。

通常3DモデルはUVと呼ばれるテクスチャのどの部分をメッシュのどこの部分に貼るのか?という情報を持っています。

TriplanerMapを使用することでこの情報を無視して画像を張ることができます。 

簡単に説明するとTriplanerMapを使用することで画像のゆがみや破断がなくなります。

ただし通常のサンプリングに比べて処理が重いことが知られていますので使用は最低限に抑えるべきと言われています。

・もっと詳しく

準備中

〇Super Sampling AntiAliasing(画像のノイズを取り除く)

SSAAは画像を使用しているオブジェクトに対して使用するオプションになります。

通常の場合画像を使用しているオブジェクトから一定の距離が離れた場合MiniMapと呼ばれるもとの画像を小さくした画像へ切り替えられます。

 この仕組みは次のUnityの動画がわかりやすいです。

www.youtube.com

 通常MiniMapを使用することで見た目がぼやけてしまうことがありますが、SSAAを使用することでぼやけがなくはっきりと描画を行うことができます。

・もっと詳しく

redhologerbera.hatenablog.com

〇ReneringOption

 レンダリングオプションはその名の通り、基本機能に追加して使用できるアクセントになります。

GraphicsToolsStandardShaderの機能の多くを占めるのがこのRenderingOptionになります。

・もっと詳しく

redhologerbera.hatenablog.com

〇Light Mode(ライトをどう受けるか?)

LightModeはv4.0以降で新たにまとめられた機能です。

それ以前はDirectionalLightのチェックボックスで構成されていました。

Enumで3種類から選択することになります。

表示 説明
Unlit Unityのライトの影響を受けない  
Lit - Directional UnityのDirectionalLightを使用する
Lit - Distant DistantLightのを使用する

 Unlitの場合はUnityのライトの影響を受けない都合上スムースやメタリックなどのパラメータは使用できなくなります。

 またライトモードによって使用できるオプションが変わります。

Lit

DistanceLight

Unlit

・もっと詳しく

準備中

〇Distance Light

Light ModeがDistance Lightの場合、Unity内にDistanceLightコンポーネントをアタッチしたオブジェクトを光源として使用することができます。

 Distance Lightコンポーネントは、DirectionalLight の代わりとして使用することができ、太陽や月など、環境にとって重要な光源を再現することができます。

 これはDirectionalLightとは別に使用できるため複雑な表現が可能となっています。

・もっと詳しく

・C#側の実装と使い方

redhologerbera.hatenablog.com

〇Specular Highlights(光沢のハイライト)

Specular Highlightsはメタリックを使用している場合など反射を使用している場合にハイライトを使用するかという機能です。

Specular Highlightsがオフ

Specular Highlightsがオン

・もっと詳しく

準備中

〇Spherical Harmonics(環境になじませる)

日本語では球面調和関数と呼ばれています。

ライトプローブを使用してシーン内の環境光を近似する機能です。

通常の状態

Spherical Harmonicsが有効 スカイボックスから青成分が反映されています

・もっと詳しく

準備中

〇Non-Photorealistic Rendering(トゥーン調にする)

この機能は非写実的描画を行う機能です。

日本ではToonShaderとも呼ばれる機能で影がはっきりつくことでオブジェクトのメリハリがつき、コミック調な印象を受ける機能です。

筆者のおすすめの使い方としてはNormalMapと併用することでよりコミック調を演出できます。

・もっと詳しく

この機能は筆者が提案、実装を行っています。

redhologerbera.hatenablog.com

〇Reflections(鏡面効果)

Redlectionsを有効にしている場合Smoothnessの値に応じて周囲の環境光を取り入れた反射を実現します。

Reflectionを有効

Reflectionを無効

・もっと詳しく

準備中

〇RimLight(縁を発光させる)

RimLightを有効にすることでオブジェクトの淵部分にほんのり光が付くような見た目を実現できます。

 Powerの係数で強さを変えることもできます。

透過するオブジェクトと使用するととくに相性が良いです

・もっと詳しく

準備中

〇Vertex Colors(モデルの頂点カラーを使用)

Vertex Colorsとは頂点カラーのことを指します。

 これはモデルの頂点が保持している色情報を使用するという意味でテクスチャなどを使用せずモデル単体で完結するため軽量ですが、反面モデル側の実装が必要です。

・もっと詳しく

準備中

〇Vertex Extrusion(モデルの膨張縮小)

Vertex Extrusionとは直訳すると頂点押し出しという意味です。

通常の状態

Vertex Extrusionを使用している状態

これはその名の通りモデルのもつ頂点を法線方向に展開(押し出し)する機能で、スケールが変わるように見えますが、UnityのTransform.scaleを変更しているわけではないのでこれは見た目上のものになります。

また、メッシュ事に分離されているモデル(=面同士がつながっていないモデル)ではこの機能によってメッシュが散る、集まるような特殊なアニメーションを行うこともできます。

・もっと詳しく

redhologerbera.hatenablog.com

〇Clipping Border(オブジェクトのカット)

Clopping BorderはMRGTで提供されているスクリプトと併用して使用することが想定されている機能です。

Clipping Borderを使用することでオブジェクトの切り抜きを行うことができ、これによってたとえば人体のモデルの皮膚だけクリッピングし、筋肉や骨を表示させるといったような使い方ができます。

またColorとしてカット面から色を付けることができ、Widthで大きさを変えることができます。

・もっと詳しく

準備中

〇Near Fade(ユーザーとの距離に応じてフェードイン、フェードアウト)

Near Fadeはユーザーが近づいた場合にオブジェクトにFadeを掛けるという機能です。

Nearと名前はついていますが、パラメータ次第ではFar Fadeも行うことができます。

・もっと詳しく

準備中

〇Fluent Options

FluentとはGraphicsTools StandardShaderはMicrsoftの提供するFluent Designeに基づいて開発、提供がされています。

これはMicrosoftの提唱するUIデザイン思想で、以下の要素から構築されています。

ここではこの思想に基づいたオプションが提供されています。

〇Hover Light(ポインターがあたっている個所にハイライト)

Hover Lightを有効にした場合HoverLightコンポーネントを使用しているオブジェクトと接触することでメッシュの表面にハイライトがあたります。

MRTKを使用している場合はHandRayなどに見られる機能で、CursorVisualオブジェクトにHoverLightコンポーネントがアタッチされています。

基本的な設定はHoverLightコンポーネントから行います。

例えば次の例ではHoverLightを赤に設定しています。

またOverride Colorのオプションを使用することでそのマテリアルの場合の色を指定できます。

左のオブジェクトのマテリアルにOverride Colorを使用しています

・もっと詳しく

準備中

〇Proximity Light(接近時にハイライトを出す)

Proximity Lightはその名の通りProximity Lightコンポーネントがアタッチされているオブジェクトが接近した場合に表示されるハイライトです。

近くにある左手にProxmity Lightが反映

オプションとしてOverride Colorを使用することができ、有効にすることでCenter Color(中心色)Middle Color(中間色)Outer Color(外縁色)のカスタマイズができます。

オプションとしてSubtractive(減算)が選択できます。

ライトは通常加算方式で行われます

 "描画結果"="オブジェクトの色"+"ライト"

しかしながらこのオプションを有効にした場合ライトの計算が加算ではなく減算になります。

 "描画結果"="オブジェクトの色"-"ライト"

オブジェクトの色が黒の場合わかりやすいです。

左)デフォルト 右)Subtractive有効

最後のオプションがTwo Sidedです。

これはオブジェクトの背面にもProxmityLightを適応する機能です。

・もっと詳しく

準備中

〇Border Light(UVに合わせて縁を表示)

Widthはライトの大きさになります。またBrightnessは光の強さになります。

モード 説明
Brightness デフォルト
HoverColor HoverLightの色を利用する
Color Border Colorを上塗りする
Gradient GradientColorの色を使用する

HoverColorモード

Colorモード

Gradientモード

・もっと詳しく

準備中

〇Round Corners(エッジをまるくする)

Round Cornersを使用するとエッジを丸くすることができます。

これはMRTKのUIなどでもよく使用されている表現方法になります。

 オプションのIndependent Cornersを使用するとエッジごとに曲線を調整できます。

Radiusは全体の曲線を管理し、Marginは角だけではなく全体的に縮小を行うことができます。

Edge Smoothing Modeはアンチエイリアシングの設定になります。

Automaticの場合シェーダーがアンチエイリアシング値を計算します。

・もっと詳しく

準備中

〇Inner Glow(UVに沿って縁を発光させる)

Innner GlowはRimLightとは異なりUVベースでの縁発行を行うことができます。

ColorがInner Glowの色、Powerが強さになります。

・もっと詳しく

準備中

〇Gradient Mode(グラデーションをかける)

Gradient Modeはグラデーションをかける機能です。

いくつかのタイプがあります。

Gradient Mode Iridescenceはユーザーから見たオブジェクトの角度や位置によって色味が変わるように見える機能です。

画像を割り当てることができ、Intensityで強さ、Thresholdは角度の閾値、Angleは割り当てた画像のTilingを行えます。

Gradient Mode FourPointはUV座標の四隅を基準として色を配置できるモードです。

Gradient Mode Linearはカラーカーブを用いて自分でグラデーションを作ることができる機能です。

・もっと詳しく

準備中

〇Environment Coloring(ユーザーがオブジェクトを見る角度で色を変える)

Environment Coloringはユーザーがそのオブジェクトを見る角度によって色が付く機能です。

・もっと詳しく

準備中

〇Blur Mode(URPでぼかしをかける機能)

こちらはAcrylicの機能です、URPのRenderFeatureと併用してぼかし表現を行うことができます。

・もっと詳しく

redhologerbera.hatenablog.com

〇Advanced Option

Advanced Optionはシェーダーとしての追加機能です。

〇Render Queue Override(描画順)

Render Queue Overrideは描画順にかかわるRender Queueを変更するパラメータです。

 デフォルトで-1となっていますが、デフォルト以外の値はRenerQueueと連動しており、例えば3000に設定した場合はRenderQueueも3000となります。

 あるオブジェクトより常に手前に描画したいといった場合に使用します。

〇Enable GPU Instancing(少ないドローコールで描画)

デバイスによってはGPU Instancingを使用することで数多くのオブジェクトを少ないドローコールで描画できます。

詳細はUntiyのドキュメントに詳しいです。

docs.unity3d.com

〇Enable Stencil Testing(ステンシルの設定)

 ステンシルとはシェーダーが保有できる値で、オブジェクト同士でステンシルを比較することで例えばあるオブジェクトを通して初めて見えるようにするという表現ができます。

この際にStencil Referenceが保持するステンシル値、Stencil Comparisionがほかのステンシル値とどのような場合に比較するのか? Stencil Operationは比較したステンシルのピクセル色をどのように操作するのか?というパラメータがあります。

・もっと詳しく

準備中