本日はSubShader内の処理を読み解いていきます。
#pragma vertex vert #pragma geometry geom #pragma fragment frag
WireFrameShaderでは頂点シェーダー、フラグメントシェーダーのほかにジオメトリシェーダーが実装されています。
実行環境がDirectX
#if defined(SHADER_API_D3D11) #pragma target 5.0 #endif
実行環境が[Direct3D 11]の場合[#pragma target 5.0]が定義されます。
[#pragma target 5.0]はシェーダーターゲットレベルで、これによってDirectX 11以下のデバイスをサポートから外しています。
// 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]に記載されている手法でアプローチを行っているようです。
以上がワイヤフレームシェーダーの概要です。次回以降実際のコード処理を追っていきます。
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" }