2016-05-18 9 views
0

ジオメトリシェーダを使用して頂点の法線を描きます。カメラを動かすと一部の線が部分的に消えてしまうことを除いて、すべてが予想どおりに表示されます。最初は、これは錐台のサイズのためだと思っていましたが、私はこのシーンよりも大きなものを持っています。ジオメトリシェーダの計算された線がカメラの移動で消えます

Before movement

After movement

誰かが私にラインが消えるこの効果を取り除くためにどのように任意のポインタを与えることができれば、私はそれを本当に感謝。以下は

私のジオメトリシェーダ

#version 330 core 


layout (triangles) in; 
layout (line_strip, max_vertices = 6) out; 

in Data{ 
    vec4 position; 
    vec4 t_position; 
    vec4 normal; 
    vec2 texCoord; 
    vec4 color; 
    mat4 mvp; 
    mat4 view; 
    mat4 mv; 
} received[]; 


out Data{ 
    vec4 color; 
    vec2 uv; 
    vec4 normal; 
    vec2 texCoord; 
    mat4 view; 
} gdata; 


const float MAGNITUDE = 1.5f; 

void GenerateLine(int index) { 
    const vec4 green = vec4(0.0f, 1.0f, 0.0f, 1.0f); 
    const vec4 blue = vec4(0.0f, 0.0f, 1.0f, 1.0f); 

    gl_Position = received[index].t_position; 
    //gdata.color = received[index].color; 
    gdata.color = green; 
    EmitVertex(); 

    gl_Position = received[index].t_position + received[index].normal * MAGNITUDE; 
    //gdata.color = received[index].color; 
    gdata.color = blue; 
    EmitVertex(); 

    EndPrimitive(); 
} 

void main() { 
    GenerateLine(0); // First vertex normal 
    GenerateLine(1); // Second vertex normal 
    GenerateLine(2); // Third vertex normal 
} 

バーテックスシェーダ

#version 330 


layout(location = 0) in vec3 Position; 
layout(location = 1) in vec2 TexCoord; 
layout(location = 2) in vec3 Normal; 

out Data{ 
    vec4 position; 
    vec4 t_position; 
    vec4 normal; 
    vec2 texCoord; 
    vec4 color; 
    mat4 mvp; 
    mat4 view; 
    mat4 mv; 
} vdata; 

//MVP 
uniform mat4 model; 
uniform mat4 projection; 
uniform mat4 view; 

void main() { 
    vdata.position = vec4(Position, 1.0f); 
    vdata.normal = view * model * vec4(Normal, 0.0); 
    vdata.texCoord = TexCoord; 

    vdata.view = view; 

    vec4 modelColor = vec4(0.8f, 0.8f, 0.8f, 1.0f); 
    vdata.color = modelColor; 

    vdata.mvp = projection * view * model; 
    vdata.mv = view * model; 
    vdata.t_position = vdata.mvp * vdata.position; 

    gl_Position = vdata.t_position; 
}; 
+0

間違いなく、デプスバッファクリッピングのように見えます。 – Quentin

+0

私はOpenGLの初心者です。あなたはそれを修正するようにどのように提案しますか? – Illia

+0

@Illiaおそらく、頂点シェーダーに投影行列を追加する必要があるでしょう。今のところ欠けているようです。 – Xirema

答えて

1

のコードは、他の誰がこの問題に実行している場合はソリューションには、次のされている。

glm::perspective(45.0f, m_aspectRatio, m_zNear, m_zFar); 

私はもともと私のm_zNearを0.1にしていましたが、1.0に切り替えたとき、線は消えなくなりました。なぜ私は完全にはわからない。誰かがそれを分かち合うと分かっているなら。

1

Google zFar zNearを試しましたか? Here you go

少なくとも、奇妙な助けglm :: perspective(...)機能をGoogleにしようとしていますか?

0

22時53分

でイリア5月18日'16での回答を参照して私はもともと0.1に等しい私のm_zNearがあったが、1.0にそれを切り替えたときに、ラインが消えて停止しました。なぜ私は完全にはわからない。いずれかが分かっている場合は、それを共有してください。

消える行は深度バッファクリッピングに関するものです。頂点はprojected(MV P - 行列と掛け合わされます)、ジオメトリシェーダ(GS)の投影後に頂点の位置が変更されます。 GSにおけるこれらの変化は、z値が遠近分割でnormalized device coordinates(NDC)の外になるようにする。 zNearの値が大きいほど、投影されたz値は小さくなりますので、NDCの外には入りません。 GSのMAGNITUDEの値が十分大きければ、たとえ大きいものであっても、ラインはクリッピングされます。zNearこれを修正する1つの方法は、GSで投影を行うことです。

関連する問題