2017-12-05 49 views
0

私は、このアプローチを使用して太線洞曲線を描くようにしてみてください。https://forum.libcinder.org/topic/smooth-thick-lines-using-geometry-shaderHLSLジオメトリシェーダ太線のDirectX

私はHLSLジオメトリシェーダにポートにそれを試してみました:500を修正するための寸法を設定する

  • /500気圧
  • 厚さが問題を変更していないようだ
struct PSInput 
{ 
    float4 Position : SV_POSITION; 
}; 

float2 toScreenSpace(float4 vertex) 
{ 
    float2 WIN_SCALE = { 500.0f, 500.0f }; 
    return float2(vertex.xy/vertex.w) * WIN_SCALE; 
} 

[maxvertexcount(7)] 
void main(lineadj float4 vertices[4] : SV_POSITION, inout TriangleStream<PSInput> triStream) 
{ 
    float2 WIN_SCALE = { 500.0f, 500.0f }; 

    float2 p0 = toScreenSpace(vertices[0]); // start of previous segment 
    float2 p1 = toScreenSpace(vertices[1]); // end of previous segment, start of current segment 
    float2 p2 = toScreenSpace(vertices[2]); // end of current segment, start of next segment 
    float2 p3 = toScreenSpace(vertices[3]); // end of next segment 


    // perform naive culling 
    float2 area = WIN_SCALE * 1.2; 
    if (p1.x < -area.x || p1.x > area.x) 
     return; 
    if (p1.y < -area.y || p1.y > area.y) 
     return; 
    if (p2.x < -area.x || p2.x > area.x) 
     return; 
    if (p2.y < -area.y || p2.y > area.y) 
     return; 

    float2 v0 = normalize(p1 - p0); 
    float2 v1 = normalize(p2 - p1); 
    float2 v2 = normalize(p3 - p2); 

    // determine the normal of each of the 3 segments (previous, current, next) 
    float2 n0 = { -v0.y, v0.x}; 
    float2 n1 = { -v1.y, v1.x}; 
    float2 n2 = { -v2.y, v2.x}; 

    // determine miter lines by averaging the normals of the 2 segments 
    float2 miter_a = normalize(n0 + n1); // miter at start of current segment 
    float2 miter_b = normalize(n1 + n2); // miter at end of current segment 

    // determine the length of the miter by projecting it onto normal and then inverse it 
    float THICKNESS = 1; 
    float length_a = THICKNESS/dot(miter_a, n1); 
    float length_b = THICKNESS/dot(miter_b, n1); 

    float MITER_LIMIT = 0.75; 
    //float MITER_LIMIT = -1; 
    //float MITER_LIMIT = 0.1; 

    PSInput v; 
    float2 temp; 

    //// prevent excessively long miters at sharp corners 
    if (dot(v0, v1) < -MITER_LIMIT) 
    { 
     miter_a = n1; 
     length_a = THICKNESS; 

     // close the gap 
     if (dot(v0, n1) > 0) 
     { 
      temp = (p1 + THICKNESS * n0)/WIN_SCALE; 
      v.Position = float4(temp, 1.0, 1.0); 
      triStream.Append(v); 

      temp = (p1 + THICKNESS * n1)/WIN_SCALE; 
      v.Position = float4(temp, 1.0, 1.0); 
      triStream.Append(v); 

      v.Position = float4(p1/WIN_SCALE, 1.0, 1.0); 
      triStream.Append(v); 

      //triStream.RestartStrip(); 

     } 
     else 
     { 
      temp = (p1 - THICKNESS * n1)/WIN_SCALE; 
      v.Position = float4(temp, 1.0, 1.0); 
      triStream.Append(v); 

      temp = (p1 - THICKNESS * n0)/WIN_SCALE; 
      v.Position = float4(temp, 1.0, 1.0); 
      triStream.Append(v); 

      v.Position = float4(p1/WIN_SCALE, 1.0, 1.0); 
      triStream.Append(v); 

      //triStream.RestartStrip(); 
     } 
    } 

    if (dot(v1, v2) < -MITER_LIMIT) 
    { 
     miter_b = n1; 
     length_b = THICKNESS; 
    } 

    // generate the triangle strip 
    temp = (p1 + length_a * miter_a)/WIN_SCALE; 
    v.Position = float4(temp, 1.0, 1.0); 
    triStream.Append(v); 

    temp = (p1 - length_a * miter_a)/WIN_SCALE; 
    v.Position = float4(temp, 1.0, 1.0); 
    triStream.Append(v); 

    temp = (p2 + length_b * miter_b)/WIN_SCALE; 
    v.Position = float4(temp, 1.0, 1.0); 
    triStream.Append(v); 

    temp = (p2 - length_b * miter_b)/WIN_SCALE; 
    v.Position = float4(temp, 1.0, 1.0); 
    triStream.Append(v); 

    //triStream.RestartStrip(); 

} 

私が指しているような曲線は出力されません。それはすでに太い線なしではとてもうまく動作しますが、私はそれを望みます。私は私のSinus信号にノイズを加えることができます。(y値が少しランダムに増加します)突然カーブが現れて太くなり、うまくいくように見えますが、厚くてノイズなしで表示したい。

周波数を高くしてノイズがない場合は、散点 - プロットスタイルが表示されますが、接続されたシヌスは表示されません。

VS Graphics Debuggerでデバッグすると、NoiseのないフレームでPixel-Shader-Stageが実行されていないことがわかります(?)。 ノイズのあるフレームは、動作して動作していることを示しています。

多分私の移植が間違っていて、何かを忘れてしまったかもしれません。私はプログラミングシェイダーにとって非常に新しいです。たぶん私はそのアプローチを全く懐疑的に思うかもしれない。

助けてください。

答えて

0

カリングのデフォルト動作をCullMode.Noneに設定して、描画されたすべての三角形を取得する必要がありました。