私は球(惑星上の境界線)上にいくつかのLineLoopをレンダリングしていて、それらを短い線にテッセレーションして、 例:ここでは OpenGL/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だけ頂点/フラグメントシェーダでそれを描画するとき、それは見てどのようである:
と、これは、それは私が私のtessallationを実施した後、どのように見えるかです:
また、線もテザリングされていないので、以前と同じ長さになります。
挨拶ジョニー
編集: ソリューションを自分自身を発見しました。下の回答セクションをご覧ください。
ですその '.xyz'部分だけでなく、' vec4 p'全体を正規化しますか?また、イソリンの使用法が間違っているかもしれませんが、ここには良い出典があります:[http://www.informit.com/articles/article.aspx?p=2120983](http://www.informit.com/articles/article)。 aspx?p = 2120983) – aslg
正規化ありがとうございました問題の一部でした。 – Jhonny007