旅行しながら働く ムラサメ研究所社長ブログ

主にゲームやプログラミングのログ

UNITYで影をつくる〜アクネ退治

先程 酷いアクネを出していました

f:id:murasame-labo:20180919203509p:plain

アクネというのはニキビという意味ですが、3DCGでは上記のようなゴミが出ることをいいます
上記は、影でよく出る種の デプスバッファの量子化におけるアクネではないのですが
似ているのでアクネといってみます

原因は、実は ShadowCasterにて、Posしか計算していなかったのが理由で
今回は
TRANSFER_SHADOW_CASTER_NORMALOFFSET
を使うようにします

ShadowCasterパスを直します

構造体

まず 今までは 頂点、ピクセル座標しか入力してなかったのを、色々と

頂点シェーダの入力

appdata_base構造体を使います
中身は

            struct appdata_base {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

と、頂点、法線、UVがあります

フラグメントシェーダの入力

             struct v2f {
                V2F_SHADOW_CASTER;
            };

とUNITYのマクロを使いますが、DirectionalLightだと下記のように posのみです

             struct v2f {
                float4 pos : SV_POSITION;
            };

TRANSFER_SHADOW_CASTER_NORMALOFFSET

UnityObjectToClipPosから変更

                TRANSFER_SHADOW_CASTER_NORMALOFFSET(o)

結果

アクネなくなった
f:id:murasame-labo:20180919205513p:plain