几何着色器计算的线条在相机移动时消失

时间:2016-05-18 21:25:26

标签: c++ opengl geometry-shader

我使用几何着色器绘制顶点法线。一切都按预期显示,但是当我移动相机时,一些线部分消失。首先,我认为这是由于截头尺寸,但我在场景中的其他物体比这个画得更好。

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;
};

3 个答案:

答案 0 :(得分:1)

如果有其他人遇到此问题,解决方案如下:

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

我最初的m_zNear等于0.1但是当它切换到1.0时,线条停止消失。我不完全确定为什么会这样。如果有人知道请分享。

答案 1 :(得分:1)

您是否尝试过google zFar zNear? Here you go

或者至少试图谷歌那神奇的帮助glm :: perspective(...)功能?

答案 2 :(得分:1)

参考伊利亚5月18日和16日在22:53

的回答
  

我最初的m_zNear等于0.1但是当它切换到1.0时,线条停止消失。我不完全确定为什么会这样。如果有人知道请分享

消失的线是关于深度缓冲区削波。顶点为projected(乘以MV P - 矩阵),然后在几何着色器(GS)中投影后更改顶点位置。 GS中的这些变化导致z值在透视分割中落在normalized device coordinates(NDC)之外。如果zNear值较大,则预计的z值会较小,因此不会超出NDC。虽然如果GS中MAGNITUDE的值足够大,即使使用较大的zNear,线也会被裁剪。解决这个问题的一个选择是在GS中进行投影。