   Tessellation in D3D10
  I'm just using ATI shader about NP tessellation, but result it's not the onei expectedShader:[maxvertexcount(9)]void gs_np(in triangle GS_INPUT In[3], inout TriangleStream&lt;PS_INPUT&gt; stream){    // Corner control points    float3 b300 = In[0].Pos.xyz;    float3 b030 = In[1].Pos.xyz;    float3 b003 = In[2].Pos.xyz;    // Edge 1/3 and 2/3 control points    float3 b210 = (2.0 * In[0].Pos.xyz + In[1].Pos.xyz - dot(In[1].Pos.xyz -In[0].Pos.xyz, In[0].Nor) * In[0].Nor) / 3.0;    float3 b120 = (2.0 * In[1].Pos.xyz + In[0].Pos.xyz - dot(In[0].Pos.xyz -In[1].Pos.xyz, In[1].Nor) * In[1].Nor) / 3.0;    float3 b021 = (2.0 * In[1].Pos.xyz + In[2].Pos.xyz - dot(In[2].Pos.xyz -In[1].Pos.xyz, In[1].Nor) * In[1].Nor) / 3.0;    float3 b012 = (2.0 * In[2].Pos.xyz + In[1].Pos.xyz - dot(In[1].Pos.xyz -In[2].Pos.xyz, In[2].Nor) * In[2].Nor) / 3.0;    float3 b102 = (2.0 * In[2].Pos.xyz + In[0].Pos.xyz - dot(In[0].Pos.xyz -In[2].Pos.xyz, In[2].Nor) * In[2].Nor) / 3.0;    float3 b201 = (2.0 * In[0].Pos.xyz + In[2].Pos.xyz - dot(In[2].Pos.xyz -In[0].Pos.xyz, In[0].Nor) * In[0].Nor) / 3.0;    // Center control point    float3 E = (b210 + b120 + b021 + b012 + b102 + b201) / 6.0;    float3 V = (b300 + b030 + b003) / 3.0;    float3 b111 = E + (E - V) / 2.0;    // Corner normals    float3 n200 = In[0].Nor.xyz;    float3 n020 = In[1].Nor.xyz;    float3 n002 = In[2].Nor.xyz;    // Edge mid-point control points    float3 d0 = In[1].Pos.xyz - In[0].Pos.xyz;    float3 d1 = In[2].Pos.xyz - In[1].Pos.xyz;    float3 d2 = In[0].Pos.xyz - In[2].Pos.xyz;    float3 n0 = In[1].Nor.xyz + In[0].Nor.xyz;    float3 n1 = In[2].Nor.xyz + In[1].Nor.xyz;    float3 n2 = In[0].Nor.xyz + In[2].Nor.xyz;    float3 v0 = (2.0 * dot(d0, n0) / dot(d0, d0)) * d0;    float3 v1 = (2.0 * dot(d1, n1) / dot(d1, d1)) * d1;    float3 v2 = (2.0 * dot(d2, n2) / dot(d2, d2)) * d2;    float3 n110 = normalize(n0 - v0);    float3 n011 = normalize(n1 - v1);    float3 n101 = normalize(n2 - v2);    PS_INPUT Out;    float4 g;    g.xy = 0.0;    // Loop to create nPatchLevel number of triangle strips    [loop]    for (uint y = 0; y &lt; nPatchLevel; y++)    {   float2 x01;   x01.x = y + 1;   x01.y = y;   g.z = 1.0 / (y + 1.0);   g.w = (y + 1.0) / nPatchLevel;   // Inner loop creates one triangle strip   [loop]   do   {  // Toggle between rows  g = g.zwxy;  // Compute weights  float3 w1;  w1.x = 1.0 - g.y;  float t = x01.x * g.x;  w1.z = g.y * t;  w1.y = g.y - w1.z;  // Weights squared and cubed  float3 w2 = w1 * w1;  float3 w3 = w1 * w2;  // Cubic interpolation for the position  float3 position = b300 * w3.x + b030 * w3.y + b003 * w3.z + b210 * (3.0 * w2.x * w1.y) + b120 * (3.0 * w1.x * w2.y) + b201 * (3.0 * w2.x * w1.z) + b021 * (3.0 * w2.y * w1.z) + b102 * (3.0 * w1.x * w2.z) + b012 * (3.0 * w1.y * w2.z) + b111 * (6.0 * w1.x * w1.y * w1.z);  // Quadratic interpolation for the normal  float3 Nor = normalize( n200 * w2.x + n020 * w2.y + n002 * w2.z + n110 * (w1.x * w1.y) + n011 * (w1.y * w1.z) + n101 * (w1.z * w1.x));  // Linear interpolation for the texture coordinate  float2 Tex = w1.x * In[0].Tex + w1.y * In[1].Tex + w1.z * In[2].Tex;  // Output the vertex  float4x4 mvp = mul(mul(WorldMatrix,ViewMatrix),ProjMatrix);  Out.Pos = mul(mvp,float4(position,1));  Out.Nor = Nor;  Out.Tex = Tex;  stream.Append(Out);  x01.x--;  // Toggle between rows  x01 = x01.yx;   }   while (x01.x &gt;= 0);   stream.RestartStrip();    }Result is very strange.the shader it's copy and paste from Ati demo's one.Original scene:http://img4.imageshack.us/i/origqpy.jpg/Another tessellation alghoritm:http://img3.imageshack.us/i/92063766.jpg/Ati shader:http://img4.imageshack.us/i/nonva.jpg/   