1 cbuffer UniformBlock0 : register(b0)
\r
3 float4x4 model_view_matrix;
\r
4 float4x4 proj_matrix;
\r
5 float4x4 model_view_proj_matrix;
\r
6 float3x3 normal_matrix;
\r
12 // =============================================================================
\r
14 // =============================================================================
\r
16 float3 PositionWS : POSITION;
\r
17 float3 NormalWS : NORMAL;
\r
21 float3 PositionWS : POSITION;
\r
24 struct HSTrianglePatchConstant {
\r
25 float EdgeTessFactor[3] : SV_TessFactor;
\r
26 float InsideTessFactor : SV_InsideTessFactor;
\r
27 float3 NormalWS[3] : NORMAL;
\r
30 HSTrianglePatchConstant HSPatchConstant(InputPatch<HSInput, 3> patch)
\r
32 float3 roundedEdgeTessFactor = tess_factor;
\r
33 float roundedInsideTessFactor = 3;
\r
34 float insideTessFactor = 1;
\r
36 HSTrianglePatchConstant result;
\r
38 // Edge and inside tessellation factors
\r
39 result.EdgeTessFactor[0] = roundedEdgeTessFactor.x;
\r
40 result.EdgeTessFactor[1] = roundedEdgeTessFactor.y;
\r
41 result.EdgeTessFactor[2] = roundedEdgeTessFactor.z;
\r
42 result.InsideTessFactor = roundedInsideTessFactor;
\r
45 result.NormalWS[0] = patch[0].NormalWS;
\r
46 result.NormalWS[1] = patch[1].NormalWS;
\r
47 result.NormalWS[2] = patch[2].NormalWS;
\r
53 [partitioning("fractional_odd")]
\r
54 [outputtopology("triangle_ccw")]
\r
55 [outputcontrolpoints(3)]
\r
56 [patchconstantfunc("HSPatchConstant")]
\r
58 InputPatch<HSInput, 3> patch,
\r
59 uint id : SV_OutputControlPointID
\r
63 output.PositionWS = patch[id].PositionWS;
\r
67 // =============================================================================
\r
69 // =============================================================================
\r
70 struct GSVertexInput {
\r
71 float3 PositionWS : POSITION;
\r
72 float3 NormalWS : NORMAL;
\r
75 struct GSVertexOutput {
\r
76 float4 PositionCS : SV_POSITION;
\r
81 triangle GSVertexInput input[3],
\r
82 inout LineStream<GSVertexOutput> output
\r
86 float3 P0 = input[0].PositionWS.xyz;
\r
87 float3 P1 = input[1].PositionWS.xyz;
\r
88 float3 P2 = input[2].PositionWS.xyz;
\r
90 GSVertexOutput vertex;
\r
95 float4 Q0 = mul(proj_matrix, float4(P0, 1.0));
\r
96 float4 Q1 = mul(proj_matrix, float4(P1, 1.0));
\r
97 float4 Q2 = mul(proj_matrix, float4(P2, 1.0));
\r
100 vertex.PositionCS = Q0;
\r
101 output.Append(vertex);
\r
102 vertex.PositionCS = Q1;
\r
103 output.Append(vertex);
\r
104 output.RestartStrip();
\r
107 vertex.PositionCS = Q1;
\r
108 output.Append(vertex);
\r
109 vertex.PositionCS = Q2;
\r
110 output.Append(vertex);
\r
111 output.RestartStrip();
\r
114 vertex.PositionCS = Q2;
\r
115 output.Append(vertex);
\r
116 vertex.PositionCS = Q0;
\r
117 output.Append(vertex);
\r
118 output.RestartStrip();
\r