vertex_submit_ext 함수 설명
vertex_submit_ext
함수는 주어진 정점 버퍼에서 정점의 범위를 GPU에 제출하여 그리기 위해 사용됩니다. 제출할 정점의 범위는 오프셋과 제출할 정점의 수로 제공됩니다. 오프셋은 0보다 큰 값일 수 있으며, 제출할 정점의 수는 실제 제출할 정점의 수입니다. -1을 사용하면 오프셋부터 시작하는 모든 정점이 제출됩니다.
사용 주의 사항
- 이 함수는 Draw Events에서만 사용할 수 있습니다.
- 일반 정점 버퍼와 동결된 정점 버퍼 모두 지원됩니다.
- 제출할 정점의 수는 그리는 원시 타입에 따라 달라야 합니다.
- 전체 정점 버퍼를 제출해야 하는 경우
vertex_submit
함수를 사용할 수 있습니다. - 삼각형 팬(
pr_trianglefan
)은 이 함수를 호출할 때 지원되지 않는 플랫폼에서 내부적으로 삼각형 리스트(pr_trianglelist
)로 변환됩니다.
문법
vertex_submit_ext(buffer, primtype, texture, offset, number);
인자 설명
인자 | 타입 | 설명 |
---|---|---|
buffer | Vertex Buffer | 사용할 정점 버퍼 |
primtype | Primitive Type Constant | 사용할 원시 타입 |
texture | Texture | 사용할 텍스처 (또는 -1은 텍스처 없음) |
offset | Real | 정점 버퍼의 오프셋 또는 제출할 첫 번째 정점의 인덱스. 0보다 커야 함. -1을 사용하여 주어진 오프셋 이후의 모든 정점을 제출 |
number | Real | 제출할 정점의 수. 이 값은 정점 버퍼의 크기로 제한됨. |
예제
예제 1: 기본 사용
Draw Event
vertex_submit_ext(vb, pr_trianglelist, -1, 5, 6);
위 코드는 vertex_submit_ext
함수를 기본적으로 호출하는 예제입니다. 제출할 정점의 수는 6으로, 이는 사용된 원시 타입인 pr_trianglelist
에 필요한 3의 배수입니다.
예제 2: 점진적으로 선 그리기
Create Event
vb = vertex_create_buffer();
vertex_begin(vb, fmt_default);
repeat(100) {
vertex_position_3d(vb, random(room_width), random(room_height), 0);
vertex_color(vb, c_white, 1);
vertex_texcoord(vb, 0, 0);
}
vertex_end(vb);
Draw Event
var _num = (current_time / 1000 * 12) mod (vertex_get_number(vb) + 1);
vertex_submit_ext(vb, pr_linestrip, -1, 0, _num);
위 코드는 100개의 랜덤 포인트로 정점 버퍼를 채우고, current_time
의 값을 사용하여 점진적으로 더 많은 포인트를 그리는 예제입니다.
예제 3: 정점 그룹 만들기
Create Event
vb = vertex_create_buffer();
arr_groups = [];
var _px, _py, _col;
vertex_begin(vb, fmt_default);
for(var i = 0; i < 8; i++) {
_px = random(room_width);
_py = random(room_height);
_col = choose(c_red, c_blue, c_green, c_yellow);
repeat(3) {
vertex_position_3d(vb, _px + random_range(-20, 20), _py + random_range(-20, 20), 0);
vertex_color(vb, _col, 1);
vertex_texcoord(vb, 0, 0);
}
array_push(arr_groups, {visible: true, range: {offset: i * 3, num: 3}});
}
vertex_end(vb);
vertex_freeze(vb);
Draw Event
var i = 0, _num = array_length(arr_groups);
repeat(_num) {
var _group = arr_groups[i++];
if (!_group.visible) { continue; }
vertex_submit_ext(vb, pr_trianglelist, -1, _group.range.offset, _group.range.num);
}
위 코드는 정점 버퍼를 정점 그룹으로 처리하는 방법을 보여줍니다. 각 그룹은 범위와 정점 수로 정의되며, 각 그룹의 가시성을 개별적으로 설정할 수 있습니다.