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 |