1617a3babSopenharmony_cicbuffer UniformBlock0 : register(b0) 2617a3babSopenharmony_ci{ 3617a3babSopenharmony_ci float4x4 model_view_matrix; 4617a3babSopenharmony_ci float4x4 proj_matrix; 5617a3babSopenharmony_ci float4x4 model_view_proj_matrix; 6617a3babSopenharmony_ci float3x3 normal_matrix; 7617a3babSopenharmony_ci float3 color; 8617a3babSopenharmony_ci float3 view_dir; 9617a3babSopenharmony_ci float3 tess_factor; 10617a3babSopenharmony_ci}; 11617a3babSopenharmony_ci 12617a3babSopenharmony_ci// ============================================================================= 13617a3babSopenharmony_ci// Hull Shader 14617a3babSopenharmony_ci// ============================================================================= 15617a3babSopenharmony_cistruct HSInput { 16617a3babSopenharmony_ci float3 PositionWS : POSITION; 17617a3babSopenharmony_ci float3 NormalWS : NORMAL; 18617a3babSopenharmony_ci}; 19617a3babSopenharmony_ci 20617a3babSopenharmony_cistruct HSOutput { 21617a3babSopenharmony_ci float3 PositionWS : POSITION; 22617a3babSopenharmony_ci}; 23617a3babSopenharmony_ci 24617a3babSopenharmony_cistruct HSTrianglePatchConstant { 25617a3babSopenharmony_ci float EdgeTessFactor[3] : SV_TessFactor; 26617a3babSopenharmony_ci float InsideTessFactor : SV_InsideTessFactor; 27617a3babSopenharmony_ci float3 NormalWS[3] : NORMAL; 28617a3babSopenharmony_ci}; 29617a3babSopenharmony_ci 30617a3babSopenharmony_ciHSTrianglePatchConstant HSPatchConstant(InputPatch<HSInput, 3> patch) 31617a3babSopenharmony_ci{ 32617a3babSopenharmony_ci float3 roundedEdgeTessFactor = tess_factor; 33617a3babSopenharmony_ci float roundedInsideTessFactor = 3; 34617a3babSopenharmony_ci float insideTessFactor = 1; 35617a3babSopenharmony_ci 36617a3babSopenharmony_ci HSTrianglePatchConstant result; 37617a3babSopenharmony_ci 38617a3babSopenharmony_ci // Edge and inside tessellation factors 39617a3babSopenharmony_ci result.EdgeTessFactor[0] = roundedEdgeTessFactor.x; 40617a3babSopenharmony_ci result.EdgeTessFactor[1] = roundedEdgeTessFactor.y; 41617a3babSopenharmony_ci result.EdgeTessFactor[2] = roundedEdgeTessFactor.z; 42617a3babSopenharmony_ci result.InsideTessFactor = roundedInsideTessFactor; 43617a3babSopenharmony_ci 44617a3babSopenharmony_ci // Constant data 45617a3babSopenharmony_ci result.NormalWS[0] = patch[0].NormalWS; 46617a3babSopenharmony_ci result.NormalWS[1] = patch[1].NormalWS; 47617a3babSopenharmony_ci result.NormalWS[2] = patch[2].NormalWS; 48617a3babSopenharmony_ci 49617a3babSopenharmony_ci return result; 50617a3babSopenharmony_ci} 51617a3babSopenharmony_ci 52617a3babSopenharmony_ci[domain("tri")] 53617a3babSopenharmony_ci[partitioning("fractional_odd")] 54617a3babSopenharmony_ci[outputtopology("triangle_ccw")] 55617a3babSopenharmony_ci[outputcontrolpoints(3)] 56617a3babSopenharmony_ci[patchconstantfunc("HSPatchConstant")] 57617a3babSopenharmony_ciHSOutput HSMain( 58617a3babSopenharmony_ci InputPatch<HSInput, 3> patch, 59617a3babSopenharmony_ci uint id : SV_OutputControlPointID 60617a3babSopenharmony_ci) 61617a3babSopenharmony_ci{ 62617a3babSopenharmony_ci HSOutput output; 63617a3babSopenharmony_ci output.PositionWS = patch[id].PositionWS; 64617a3babSopenharmony_ci return output; 65617a3babSopenharmony_ci} 66617a3babSopenharmony_ci 67617a3babSopenharmony_ci// ============================================================================= 68617a3babSopenharmony_ci// Geometry Shader 69617a3babSopenharmony_ci// ============================================================================= 70617a3babSopenharmony_cistruct GSVertexInput { 71617a3babSopenharmony_ci float3 PositionWS : POSITION; 72617a3babSopenharmony_ci float3 NormalWS : NORMAL; 73617a3babSopenharmony_ci}; 74617a3babSopenharmony_ci 75617a3babSopenharmony_cistruct GSVertexOutput { 76617a3babSopenharmony_ci float4 PositionCS : SV_POSITION; 77617a3babSopenharmony_ci}; 78617a3babSopenharmony_ci 79617a3babSopenharmony_ci[maxvertexcount(6)] 80617a3babSopenharmony_civoid GSMain( 81617a3babSopenharmony_ci triangle GSVertexInput input[3], 82617a3babSopenharmony_ci inout LineStream<GSVertexOutput> output 83617a3babSopenharmony_ci) 84617a3babSopenharmony_ci{ 85617a3babSopenharmony_ci 86617a3babSopenharmony_ci float3 P0 = input[0].PositionWS.xyz; 87617a3babSopenharmony_ci float3 P1 = input[1].PositionWS.xyz; 88617a3babSopenharmony_ci float3 P2 = input[2].PositionWS.xyz; 89617a3babSopenharmony_ci 90617a3babSopenharmony_ci GSVertexOutput vertex; 91617a3babSopenharmony_ci // Totally hacky... 92617a3babSopenharmony_ci P0.z += 0.001; 93617a3babSopenharmony_ci P1.z += 0.001; 94617a3babSopenharmony_ci P2.z += 0.001; 95617a3babSopenharmony_ci float4 Q0 = mul(proj_matrix, float4(P0, 1.0)); 96617a3babSopenharmony_ci float4 Q1 = mul(proj_matrix, float4(P1, 1.0)); 97617a3babSopenharmony_ci float4 Q2 = mul(proj_matrix, float4(P2, 1.0)); 98617a3babSopenharmony_ci 99617a3babSopenharmony_ci // Edge 0 100617a3babSopenharmony_ci vertex.PositionCS = Q0; 101617a3babSopenharmony_ci output.Append(vertex); 102617a3babSopenharmony_ci vertex.PositionCS = Q1; 103617a3babSopenharmony_ci output.Append(vertex); 104617a3babSopenharmony_ci output.RestartStrip(); 105617a3babSopenharmony_ci 106617a3babSopenharmony_ci // Edge 1 107617a3babSopenharmony_ci vertex.PositionCS = Q1; 108617a3babSopenharmony_ci output.Append(vertex); 109617a3babSopenharmony_ci vertex.PositionCS = Q2; 110617a3babSopenharmony_ci output.Append(vertex); 111617a3babSopenharmony_ci output.RestartStrip(); 112617a3babSopenharmony_ci 113617a3babSopenharmony_ci // Edge 2 114617a3babSopenharmony_ci vertex.PositionCS = Q2; 115617a3babSopenharmony_ci output.Append(vertex); 116617a3babSopenharmony_ci vertex.PositionCS = Q0; 117617a3babSopenharmony_ci output.Append(vertex); 118617a3babSopenharmony_ci output.RestartStrip(); 119617a3babSopenharmony_ci} 120