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 
} 

Vertex Shader

#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.

Или, по крайней мере, пытаться Google, что чудодейственная помощь glm :: перспектива (...) функция?

0

Ссылаясь на ответ на Illia 18 мая '16 в 22:53

Я изначально был мой m_zNear, равного 0,1, но при переключении его на 1,0, линии перестали исчезать. Я не совсем уверен, почему это так. Если кто-либо знает, пожалуйста, поделитесь им

Исчезающая линия - это отсечение буфера глубины. Вершина равна projected (умножается на MV P -матрица), а затем изменяется положение вершины ПОСЛЕ проектирования в геометрическом шейдере (GS). Эти изменения в GS приводят к тому, что z-значение выходит за пределы normalized device coordinates (NDC) в перспективном делении. С большим значением zNear проецируемое значение z меньше, поэтому оно не выходит за пределы NDC. Хотя, если значение MAGNITUDE в GS было достаточно большим, линии были бы обрезаны в любом случае даже с большим zNear. Один из вариантов исправить это - сделать проецирование в GS.