Line to Quad shader

OpenGL에서 Line을 Quad로 변경하는 OpenGL Geometry 쉐이더..
screen_size 는 viewport width, height 의 값.

아래는 메시의 edge (wireframe) 를 그린것인데..

line_width를 1.0으로 하면.. Line 처럼 보이지만..

10.0으로 변경하면..

요렇게 Quad Primitive 로 라인을 그린걸 볼수 있음.

이렇게 Line을 Quad로 그리는 이유는
1. 속도 때문. 태초에 OpenGL 은 Triangle (Quad는 내부적으로 Triangle 두개로 표현됨) 을 그리는데 빠른 성능을 내기때문임.
2. Line은 offset (glPolygonOffset)을 할수 없어서 Face 위에 정확하게 라인을 그리기가 어려움. 이렇게 Quad로 변경해서 그리면 Offset 이 가능하므로 선을 surface 위에 이쁘게 그릴수가 있음.

#version 400 compatibility
layout(lines) in;
layout(triangle_strip, max_vertices = 4) out;

uniform float line_width;
uniform vec2 screen_size;

void main()
{
  // start/end points of line
  vec4 p0 = gl_in[0].gl_Position;
  vec4 p1 = gl_in[1].gl_Position;
  
  // convert to screen space
  p0.xy = p0.xy / p0.w * screen_size;
  p1.xy = p1.xy / p1.w * screen_size;

  // compute dir and normal
  vec2 lineDir = p1.xy - p0.xy;
  vec2 lineNormal = normalize(vec2(-lineDir.y, lineDir.x));
  
  
  // create screen-aligned quad
  vec2 offset = lineNormal * line_width;


  gl_Position = vec4( (p0.xy + offset) * p0.w / screen_size, p0.z, p0.w);
  EmitVertex();
  
  gl_Position = vec4( (p0.xy - offset) * p0.w / screen_size, p0.z, p0.w);
  EmitVertex();
  
  gl_Position = vec4( (p1.xy + offset) * p1.w / screen_size, p1.z, p1.w);
  EmitVertex();
  
  gl_Position = vec4( (p1.xy - offset) * p1.w / screen_size, p1.z, p1.w);
  EmitVertex();
  
  EndPrimitive();
}

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다


This site uses Akismet to reduce spam. Learn how your comment data is processed.