本日は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"
}