본문으로 바로가기

Line to Quad shader

category 블로그 (Blog)/개발로그 (Devlogs) 2024. 3. 12. 14:00

OpenGL에서 Line을 Quad로 변경하는 OpenGL Geometry 쉐이더..


아래는 메시의 edge (wireframe) 를 그린것인데.. line_width를 1.0으로 하면.. Line 처럼 보이지만..

10.0으로 변경하면..

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

이렇게 Line을 Quad로 그리는 이유는

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

아래 코드에서 screen_size 는 viewport width, height 의 값.

#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();
}

'블로그 (Blog) > 개발로그 (Devlogs)' 카테고리의 다른 글

가장 근접 거리의 포인트 검색  (0) 2024.03.12
KD-Tree 예제  (0) 2024.03.12
‘좋은 Mesh’에 대한 5가지 오해  (0) 2024.03.12
robin hood hashing  (0) 2024.03.12
PMP 라이브러리 Half Edge 테스트  (0) 2024.03.12