夜風のMixedReality

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

MRTKワイヤフレームShaderを調査する。 その③ ワイヤフレームシェーダーの概要

本日はSubShader内の処理を読み解いていきます。

   #pragma vertex vert
   #pragma geometry geom
   #pragma fragment frag

WireFrameShaderでは頂点シェーダー、フラグメントシェーダーのほかにジオメトリシェーダーが実装されています。

実行環境がDirectX

    #if defined(SHADER_API_D3D11)
            #pragma target 5.0
            #endif

docs.unity3d.com

実行環境が[Direct3D 11]の場合[#pragma target 5.0]が定義されます。

[#pragma target 5.0]はシェーダーターゲットレベルで、これによってDirectX 11以下のデバイスをサポートから外しています。

docs.unity3d.com

            // Based on approach described in Shader-Based Wireframe Drawing (2008)
            // http://orbit.dtu.dk/en/publications/id(13e2122d-bec7-48de-beca-03ce6ea1c3f1).html

コメントによるとこのShaderは[Shader-Based Wireframe Drawing]に記載されている手法でアプローチを行っているようです。

orbit.dtu.dk

以上がワイヤフレームシェーダーの概要です。次回以降実際のコード処理を追っていきます。

 SubShader
    {
        Tags { "RenderType" = "Opaque" }
        Blend[_SrcBlend][_DstBlend]
        BlendOp[_BlendOp]
        ZTest[_ZTest]
        ZWrite[_ZWrite]
        Cull[_CullMode]
        Offset[_ZOffsetFactor],[_ZOffsetUnits]
        ColorMask[_ColorWriteMask]

        Pass
        {
            Offset 50, 100

            CGPROGRAM
            #pragma vertex vert
            #pragma geometry geom
            #pragma fragment frag

            #if defined(SHADER_API_D3D11)
            #pragma target 5.0
            #endif

            #include "UnityCG.cginc"

            float4 _BaseColor;
            float4 _WireColor;
            float _WireThickness;

            // Based on approach described in Shader-Based Wireframe Drawing (2008)
            // http://orbit.dtu.dk/en/publications/id(13e2122d-bec7-48de-beca-03ce6ea1c3f1).html

            struct v2g
            {
                ...
            };

            v2g vert(appdata_base v)
            {
                 ...
            }

            // inverseW is to counteract the effect of perspective-correct interpolation so that the lines
            // look the same thickness regardless of their depth in the scene.
            struct g2f
            {
               ...
            };

            [maxvertexcount(3)]
            void geom(triangle v2g i[3], inout TriangleStream<g2f> triStream)
            {
              ...
            }

            float4 frag(g2f i) : COLOR
            {
                 ...
            }
            ENDCG
        }
    }

    FallBack "Mixed Reality Toolkit/Standard"
    CustomEditor "Microsoft.MixedReality.Toolkit.Editor.MixedRealityWireframeShaderGUI"
}