기본 요소와 정점 빌딩 가이드
이 가이드는 사용자 정의 정점 포맷과 정점 버퍼를 사용하여 프리미티브를 구축하고 사용하는 방법을 간략하게 설명합니다. 일반적으로 3D 작업, 특수 효과, 복잡한 그리기 과정 또는 셰이더와 함께 작업할 때는 사용되는 정점 포맷에 대해 크게 걱정할 필요가 없습니다. 게임 메이커가 정점 데이터를 자동으로 설정하고 전달해 주기 때문입니다. 하지만 속도를 높이거나 추가 정보를 전달해야 할 때는 직접 정점 데이터를 만들어야 할 수 있습니다.
기본 정점 포맷
기본 정점 포맷은 일반적으로 3D 위치(x, y, z), 색상(알파 포함), UV 텍스처 좌표를 포함하며, 이를 직접 만드는 경우는 다음과 같습니다.
vertex_format_begin();
vertex_format_add_position_3d();
vertex_format_add_colour();
vertex_format_add_texcoord();
my_format = vertex_format_end();
만약 셰이더를 사용하여 정점의 위치만 조작한다면, 색상이나 텍스처 데이터를 전달할 필요가 없습니다. 이 경우는 아래와 같이 사용자 정의 포맷을 만들 수 있습니다.
vertex_format_begin();
vertex_format_add_position_3d();
my_format = vertex_format_end();
정점 속성 및 필수 사항
정점 포맷을 정의할 때 사용할 수 있는 다섯 가지 정점 속성이 있습니다: - 색상 - 노멀 - 3D 위치 - 위치 - 텍스처 좌표
일반적으로 포맷의 일부로 3D 위치를 항상 제공해야 하지만 나머지는 선택 사항입니다. 정점 포맷을 생성한 후에는 정점 속성을 정의한 순서를 준수해야 합니다.
정점 포맷 제거
정점 포맷은 메모리를 요구하므로 필요하지 않을 때는 다음 함수를 사용하여 제거해야 합니다.
vertex_format_delete(my_format);
정점 버퍼
생성한 모든 프리미티브는 정점 버퍼에 저장됩니다. 정점 버퍼는 미리 생성하고, 이후 프리미티브를 구축하는 데 참고합니다. 정점 버퍼는 다양한 프리미티브를 생성하는 데 여러 번 재사용할 수 있으며, 게임이나 레벨의 특정 프리미티브 유형을 유지하도록 "동결"할 수도 있습니다.
삼각형 프리미티브 예제
한 개의 삼각형 프리미티브를 구축하는 예시 코드는 아래와 같습니다:
// Create Event
v_buff = vertex_create_buffer();
vertex_begin(v_buff, global.my_format);
vertex_position(v_buff, 10, 10);
vertex_colour(v_buff, c_white, 1);
vertex_texcoord(v_buff, 0, 0);
vertex_position(v_buff, 110, 10);
vertex_colour(v_buff, c_white, 1);
vertex_texcoord(v_buff, 1, 0);
vertex_position(v_buff, 110, 110);
vertex_colour(v_buff, c_white, 1);
vertex_texcoord(v_buff, 1, 1);
vertex_end(v_buff);
// Draw Event
var tex = sprite_get_texture(spr_Background, 0);
shader_set(shd_shimmer);
vertex_submit(v_buff, pr_trianglelist, tex);
shader_reset();
이 예제에서는 먼저 인스턴스의 Create Event에서 정점 버퍼를 생성하고, 삼각형 프리미티브를 구성하는 다양한 정점을 정의합니다. 그런 다음 정점 정의를 종료하고, 정점 데이터가 "v_buff" 변수에 저장됩니다.
정점 배치 및 셰이더
사용자 정의 정점 버퍼를 사용하면 GPU에 전송되는 정점 배치에 영향을 미칩니다. 정점 버퍼를 생성하면 그래픽 데이터의 최하위 수준을 생성하게 되며, 게임 메이커는 이 버퍼를 그래픽 카드에 직접 전송합니다. 최적의 배치를 원한다면, 배치할 항목을 동일한 버퍼 안에 저장해야 합니다.
정점 포맷과 셰이더 속성
GLSL ES 셰이더 내에서 정점 포맷과 셰이더 속성을 매핑하는 방법은 아래와 같습니다:
셰이더 속성 예제
attribute vec3 in_Position; // (x,y,z)
attribute vec4 in_Colour; // (r,g,b,a)
attribute vec2 in_TextureCoord; // (u,v)
정점 포맷 설정
정점 포맷을 셰이더와 호환되도록 설정하는 코드:
vertex_format_begin();
vertex_format_add_position_3d();
vertex_format_add_colour();
vertex_format_add_texcoord();
my_format = vertex_format_end();
정점 특성을 올바르게 매핑하려면, 명명 규칙을 기반으로 합니다.
정리하자면, 정점 포맷을 작성한 후에는 추가 색상 속성을 추가할 때 식별 번호를 붙여야 합니다. 여기서 주요 규칙은 포맷에 정의된 순서에 따라 속성을 매핑하는 것입니다.