しゅみぷろ読者になるしゅみぷろプログラミングとかこの広告は、90日以上更新していないブログに表示しています。ShaderはじめにForwardRenderingのShadowingについて調べたことをまとめます。github.com今回のサンプルでは以下の様な絵が出てきます。lightingを適用し、shadingを行ったもので、shadowingを行っていません。右の球はshadowingを行っていますがshadingは行っていません。下に敷いてあるPlaneオブジェクトは一番右の球と同じシェーダーを適用しています。影をつける際に用いられる手法は様々ですが、よく知られている方法にステンシルシャドウ深度バッファシャドウかあるそうです。深度バッファシャドウの根っこ:0から原理を眺めてみようシェーダーの全体像ForwardRenderingについては以下を参照してください。esprog.hatenablog.com影をつけるためのシェーダーコードは以下のようになります。}}includeファイル内のマクロを利用しているため、かなり短いコードで影の描画を行うことができます。定義した2つのパスの役割ShadowCastパスはオブジェクトの作る影を投影するためのパスです。このパスでオブジェクトの深度値をシャドウマップや深度テクスチャに描画します。ShadowReceiveパスは、影を受けるオブジェクトを描画するパスです。ShadowCastパスで描画されたシャドウマップや深度テクスチャから影を計算し、反映させます。"ShadowCaster"}でShadowCasterパスでのレンダリングを指示しています。オブジェクトのデプスをシャドウマップや深度テクスチャに描画するパスです。あるオブジェクトに他のオブジェクト(セルフシャドウも)からの影を投影する場合、ForwardRenderingであろうとDeferredShadingであろうとこのパスが必要です。ShadowCastで使われているマクロShadowCastでは以下のマクロ定義が使われています。V2F_SHADOW_CASTERTRANSFER_SHADOW_CASTER_NORMALOFFSET(o)SHADOW_CASTER_FRAGMENT(i)これらの定義を見ていきます。TRANSFER_SHADOW_CASTER_NOPOS(o,o.pos)このコード内で上記で示した3つのマクロが定義されています。様々なケースで場合分けされています。シャドウマップを用いる方法でレンダリングを行うシェーダ内では以下のように展開されます。i.hpos.zw.y;}ShadowCastパスでは、SV_Target(フラグメントシェーダーの出力色)はシャドウマップをレンダリングターゲットとします。このパスでは以下の様なシャドウマップが生成されます。その後に呼ばれるパスでは、ShadowCastパスで作られたシャドウマップとカメラの深度テクスチャからスクリーンスペースのシャドウマップが作られます。_ShadowMapTextureという記述を加える事でアクセスできるようになります。DeferredShadingについて記事を書いた時にこれを表示してみたことがあります。esprog.hatenablog.comShadowReceiveパスで使われているマクロSHADOW_COORDS(1)TRANSFER_SHADOW(o)SHADOW_ATTENUATION(i);これらの定義は様々な条件によって変わってきますが、今回はスクリーンスペースでの影の描画を例に定義を見ていきます。1.0#endifこれもまた色々な条件で分岐があるのですが、スクリーンスペースのシャドウマップを使う場合は以下のように展開されます。col;}このパスによって、以下のようにshadowingを行うオブジェクトが描画されていきます。同じシェーダーを適用している場合、オブジェクトのZ値によって描画順は前後しますが、ShadowCasterで描画されたスクリーンスペースのシャドウマップを用いて影を描画しているのがわかると思います。UnityでMatcapシェーダー書いたのでメモ。今回はリングセレクトシステム(と呼んでいきます。)はてなブログをはじめよう!es_programさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。