2016-04-27 2 views
2

私は球(惑星上の境界線)上にいくつかのLineLoopをレンダリングしていて、それらを短い線にテッセレーションして、 例:ここでは enter image description hereOpenGL/GLSLでテッセレーションされたLineLoopsを描画する

である私の現在のソースコード:

void Border::Draw() const 
{ 
    glBindVertexArray(_vao); 

    glPatchParameteri(GL_PATCH_VERTICES, 2); 
    glDrawArrays(GL_PATCHES, 0, _size); 

    glBindVertexArray(0); 
} 

バーテックスシェーダ:

#version 400 

in layout(location = 0) vec3 position; 

void main() 
{ 
    gl_Position = vec4(position, 1.0); 
} 

Tessallationコントロールシェーダ:

#version 400 

layout (vertices = 2) out; 

void main() 
{ 
    if(gl_InvocationID == 0) 
    { 
     //get the distance between two points 
     float dist = length(gl_in[0].gl_Position - gl_in[1].gl_Position); 
     gl_TessLevelOuter[0] = 1; 
     //divide line in segments of size 1.0 
     gl_TessLevelOuter[1] = abs(dist); 
    } 

    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; 
} 

Tessallati Cは、コールを描く++上の評価シェーダー

#version 400 

layout (isolines, equal_spacing) in; 

uniform float planetRadius; 
uniform mat4 view; 
uniform mat4 projection; 

void main() 
{ 
    vec4 p = mix(gl_in[0].gl_Position, gl_in[1].gl_Position, gl_TessCoord.x); 

    //offset point so it is on the spheres surface 
    p = normalize(p); 
    p *= planetRadius; 

    gl_Position = projection * view * p; 
} 

フラグメントシェーダ:私はそれが動作することを期待よう

#version 400 

out vec4 outColor; 

void main() 
{ 
    outColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 

tessallationは(等値線のドキュメントも悪い)動作するようには思えません。

これは私がLineLoopsだけ頂点/フラグメントシェーダでそれを描画するとき、それは見てどのようである:

enter image description here

と、これは、それは私が私のtessallationを実施した後、どのように見えるかです:

enter image description here

また、線もテザリングされていないので、以前と同じ長さになります。

挨拶ジョニー

編集: ソリューションを自分自身を発見しました。下の回答セクションをご覧ください。

+1

ですその '.xyz'部分だけでなく、' vec4 p'全体を正規化しますか?また、イソリンの使用法が間違っているかもしれませんが、ここには良い出典があります:[http://www.informit.com/articles/article.aspx?p=2120983](http://www.informit.com/articles/article)。 aspx?p = 2120983) – aslg

+0

正規化ありがとうございました問題の一部でした。 – Jhonny007

答えて

1

解決策が見つかりました。問題は、シェーダがラインストリップを描くことができないというテッセレーションシェイダーの中にあります。あなたはポイント{p1, p2, p3, p4, p5, p6}それが間に線を引くことにより、定義されたラインストリップHAVAその場合:
P5 P4> - - -
P3 P2>
P1を

P6>私はすべてのポイントを2回シェーダを与えることによってそれを修正しましたので、私のリストは、次のようになります。
{p1, p2, p2, p3, p3, p4, p4, p5, p5, p6, p6, p1}
tessallationシェーダは以下の行を作成:
P1 - >
P2 P2を - >
P3 P3 - >
P4 P4 - > P5
P6 P6> - -
P5

私のシェーダP1>は、次のようになります。

TessControl:

#version 430 

layout (vertices = 2) out; 

void main() 
{ 
    if(gl_InvocationID == 0) 
    { 
     float dist = length(gl_in[0].gl_Position.xyz - gl_in[1].gl_Position.xyz); 

     gl_TessLevelOuter[0] = 1; 
     gl_TessLevelOuter[1] = dist; 
    } 

    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; 
} 

TessEval:あなたはあなたがしたいことを確認

#version 430 

layout (isolines, equal_spacing) in; 

uniform float planetRadius; 
uniform mat4 view; 
uniform mat4 projection; 

void main() 
{ 
    //only interpolate and normalize xyz coordinates. Thanks to @aslg 
    vec3 p = mix(gl_in[0].gl_Position.xyz, gl_in[1].gl_Position.xyz, gl_TessCoord.x); 

    p = normalize(p); 
    p *= planetRadius; 

    gl_Position = projection * view * vec4(p, 1.0); 
} 
関連する問題