2015-11-30 2 views
-1

Я написал гео-шейдер, который получает строку (2 вершины) и должен добавить ширину (длину) вдоль линии normal. Без гео-шейдера все отображается правильно. Я также вычислил формулу с карандашом и бумагой (работал). Я их расчета по формуле:Geometry shader не работает должным образом

N1 = (- (х2 - х1), у2-у1) N2 = (х2 - х1, - (у2 - у1))

Мой код:

#version 330 core 
layout(lines) in; 
layout(triangle_strip, max_vertices = 4) out; 
uniform float length; 

void main() 
{ 
      //A -(x2 - x1) | y2 - y1 
      //B x2 - x1 | -(y2 - y1) 
      vec2 normal = normalize(vec2(gl_in[1].gl_Position.x - gl_in[0].gl_Position.x, gl_in[1].gl_Position.y - gl_in[0].gl_Position.y)); 
      vec3 normalA = vec3(-normal.x, normal.y, 0); 
      vec3 normalB = vec3(normal.x, -normal.y, 0); 
      gl_Position = gl_in[0].gl_Position + (vec4(normalB, 0) * length); 
      EmitVertex(); 
      gl_Position = gl_in[0].gl_Position + (vec4(normalA, 0) * length); 
      EmitVertex(); 
      gl_Position = gl_in[1].gl_Position + (vec4(normalA, 0) * length); 
      EmitVertex(); 
      gl_Position = gl_in[1].gl_Position + (vec4(normalB, 0) * length); 
      EmitVertex(); 
      EndPrimitive(); 
} 

Р0 [0,3, 0,3] Р1 [0,4, 0,3]

+1

Что происходит _with_ геометрии шейдеров? Вы проверяете ошибки при компиляции ваших шейдеров? –

+0

Да, когда я не применяю свою формулу, она работает. – Sens4

ответ

0

Ваша формула явно неправильно. Вы создаете полосы трассировки с нулевой областью для этих конкретных точек ввода.

Если у вас есть 2D вектор (x,y), две перпендикулярные vectos к этому являются (-y, x) и (y, -x), а не (-х, у) и (х, у) в настоящее время используется.

Для вашей входной точки P0 и P1 и исходной формуле, вы получите как normalA и normalB с у компонента 0, так что в конце концов, все 4 очка в конечном итоге в линии на у = 0,3, что приводит к появлению треугольной полосы, состоящей из двух треугольников нулевой области, которые никогда не растеризуются.

Я предлагаю код follwowing (также упрощение синтаксиса бит):

 vec2 direction = normalize(gl_in[1].gl_Position.xy - gl_in[0].gl_Position.xy); 
     vec4 offset =v ec4(-direction.y, direction.x, 0, 0) * length; 
     gl_Position = gl_in[0].gl_Position - offset; 
     EmitVertex(); 
     gl_Position = gl_in[0].gl_Position + offset; 
     EmitVertex(); 
     gl_Position = gl_in[1].gl_Position + offset; 
     EmitVertex(); 
     gl_Position = gl_in[1].gl_Position - offset; 
     EmitVertex(); 
     EndPrimitive(); 
Смежные вопросы