기본 도형 및 정점 형식
기본 도형이란?
기본 도형(Primitive)은 화면에 표시되는 내용을 정의하기 위해 점을 사용하는 그리기 유형입니다. 기본 도형은 단일 점, 선 또는 삼각형으로 구성될 수 있으며, 색상, 알파 블렌딩 및 텍스처를 적용할 수 있습니다. 이를 통해 2D 및 3D 게임에서 매우 흥미로운 효과를 만들 수 있습니다.
기본 도형의 점을 정점(Vertices)이라고 하며, 이들은 위치, 색상, 텍스처 및 기타 정보를 저장합니다. GPU는 제공된 기본 도형 유형을 사용하여 이러한 정점을 그립니다.
예를 들어, 두 개의 삼각형 기본 도형을 사용하여 사각형을 만들고, 이를 깃발 스프라이트로 텍스처링한 후, 인스턴스의 Draw 이벤트에서 깃발이 바람에 "펄럭이도록" 만들 수 있습니다. 이는 기본 도형을 구성하는 점을 수정하여 스프라이트를 왜곡함으로써 가능합니다.
기본 도형 만들기
GameMaker는 기본 도형을 그리기 위한 두 가지 방법을 제공합니다:
- 기본 도형 함수:
draw_primitive_*
및draw_vertex_*
함수 - 정점 버퍼(Vertex Buffers)
기본 도형 함수
draw_primitive_*
함수는 기본 도형을 정의하고 이를 화면(또는 표면)에 직접 그릴 수 있게 해줍니다. draw_primitive_begin
또는 draw_primitive_begin_texture
를 호출한 후, draw_vertex_*
함수를 사용하여 정점을 정의하고 마지막으로 draw_primitive_end
를 호출하여 기본 도형을 그립니다.
예제 코드
var _tex = sprite_get_texture(spr_image, 0);
draw_primitive_begin_texture(pr_trianglestrip, _tex);
draw_vertex_texture(0, 0, 0, 0);
draw_vertex_texture(100, 0, 1, 0);
draw_vertex_texture(0, 100, 0, 1);
draw_vertex_texture(100, 100, 1, 1);
draw_primitive_end();
정점 버퍼
정점 버퍼는 재사용 가능한 기본 도형을 정의하는 더 고급 방법입니다. 정점 버퍼는 정점에 대한 데이터를 저장하는 버퍼입니다. 정점 버퍼를 사용하면 기본 도형의 정의와 그리기를 분리할 수 있습니다.
정점 버퍼를 생성하려면 vertex_create_buffer
또는 vertex_create_buffer_ext
를 사용하여 새롭고 빈 정점 버퍼를 만들거나, vertex_create_buffer_from_buffer
또는 vertex_create_buffer_from_buffer_ext
를 사용하여 데이터를 버퍼에서 채울 수 있습니다.
예제 코드
// 빈 정점 버퍼 생성
vb = vertex_create_buffer();
// 데이터로 채워진 정점 버퍼 생성
var _buff = buffer_load("model.mod");
vb_model = vertex_create_buffer_from_buffer(_buff, format);
buffer_delete(_buff);
정점 버퍼는 Draw 이벤트에서 vertex_submit
을 사용하여 언제든지 제출할 수 있으며, vertex_submit_ext
를 사용하여 일부만 제출할 수도 있습니다.
텍스처 좌표
위의 코드 예제에서 UV는 정점 버퍼에 대해 다르게 제공됩니다. 이는 두 세트의 함수가 UV를 다르게 해석하기 때문입니다. draw_vertex_texture
및 draw_vertex_texture_colourmap
함수는 텍스처 페이지에서 스프라이트 영역의 좌측 상단 모서리를 (0, 0)으로, 우측 하단 모서리를 (1, 1)로 매핑합니다. 반면, vertex_texcoord
함수는 텍스처 페이지의 좌측 상단 모서리를 (0, 0)으로, 우측 하단 모서리를 (1, 1)로 매핑합니다.
정점 형식
GameMaker는 사용자가 자신의 정점 형식을 정의할 수 있도록 허용합니다. 이를 통해 셰이더 작업을 크게 가속화하거나 기능을 확장하여 놀라운 효과를 만들 수 있습니다.
정점 형식은 정점에 저장되는 속성의 목록을 정의합니다. vertex_format_begin
으로 정의를 시작하고, vertex_format_add_*
함수를 사용하여 속성을 추가한 후, vertex_format_end
로 끝냅니다.
예제 코드
vertex_format_begin();
vertex_format_add_colour();
vertex_format_add_position();
vertex_format_add_texcoord();
vertex_format_end();
정점 형식을 생성한 후, 이를 사용하여 그릴 기본 도형을 만들 수 있습니다. 기본 도형을 만들 때는 정점 형식에서 설정한 형식에 따라야 하며, 속성을 추가하는 순서도 중요합니다.
활용 예제
- 사각형 그리기
draw_primitive_begin(pr_trianglestrip);
draw_vertex(0, 0, c_red);
draw_vertex(100, 0, c_green);
draw_vertex(0, 100, c_blue);
draw_vertex(100, 100, c_yellow);
draw_primitive_end();
- 텍스처가 있는 삼각형 그리기
var tex = sprite_get_texture(spr_flag, 0);
draw_primitive_begin_texture(pr_trianglestrip, tex);
draw_vertex_texture(0, 0, 0, 0);
draw_vertex_texture(50, 100, 0.5, 1);
draw_vertex_texture(100, 0, 1, 0);
draw_primitive_end();
- 정점 버퍼를 사용한 복잡한 도형 그리기
vb = vertex_create_buffer();
vertex_begin(vb, format);
vertex_position(vb, 0, 0);
vertex_color(vb, c_white, 1);
vertex_texcoord(vb, 0, 0);
vertex_position(vb, 100, 0);
vertex_color(vb, c_white, 1);
vertex_texcoord(vb, 1, 0);
vertex_position(vb, 0, 100);
vertex_color(vb, c_white, 1);
vertex_texcoord(vb, 0, 1);
vertex_position(vb, 100, 100);
vertex_color(vb, c_white, 1);
vertex_texcoord(vb, 1, 1);
vertex_end(vb);
이 문서에서는 기본 도형과 정점 형식에 대한 개념을 설명하고, 이를 활용한 다양한 예제를 제공하였습니다.