vertex_update_buffer_from_buffer 함수 설명
vertex_update_buffer_from_buffer
함수는 주어진 버퍼의 데이터를 사용하여 정점 버퍼의 내용을 업데이트합니다. 이 함수는 고정된(frozen) 정점 버퍼를 대상으로 사용할 수 없습니다.
사용 주의 사항
- 소스 버퍼의 데이터는 대상 정점 버퍼의 정점 형식과 동일하게 포맷되어야 합니다. 그렇지 않으면 예기치 않은 결과가 발생할 수 있습니다.
vertex_format_get_info
함수를 사용하여 속성의 크기와 오프셋을 가져올 수 있습니다.- 정점 버퍼의 현재 크기 외부에 데이터를 작성하면 필요에 따라 정점 버퍼의 크기가 조정됩니다.
문법
vertex_update_buffer_from_buffer(dest_vbuff, dest_offset, src_buffer[, src_offset, src_size]);
인수 설명
인수 이름 | 타입 | 설명 |
---|---|---|
dest_vbuff | Vertex Buffer ID | 데이터를 복사할 정점 버퍼 |
dest_offset | Real | 데이터를 쓰기 시작할 대상 버퍼의 오프셋 |
src_buffer | Buffer ID | 복사할 소스 버퍼 |
src_offset | Real | 복사 시작할 소스 버퍼의 바이트 오프셋 (기본값: 0) |
src_size | Real | 소스 버퍼에서 복사할 데이터의 크기 (기본값: -1) |
src_size
가 -1일 경우 전체 버퍼가 복사됩니다.
예제 코드
다음은 vertex_update_buffer_from_buffer
함수를 사용하는 예제입니다.
vertex_format_begin();
vertex_format_add_position_3d(); // 3개의 buffer_f32 값
vertex_format_add_texcoord(); // 2개의 buffer_f32 값
vertex_format = vertex_format_end();
var _i = 0,
_vertex_size = (3 + 2) * buffer_sizeof(buffer_f32),
_buff = buffer_create(1000, buffer_fixed, 4);
repeat(51) {
repeat(3) buffer_write(_buff, buffer_f32, random(500)); // x, y, z
repeat(2) buffer_write(_buff, buffer_f32, ((_i++ mod 6) < 3)); // u, v
}
vb = vertex_create_buffer_from_buffer_ext(_buff, vertex_format, 0, 30);
vertex_update_buffer_from_buffer(vb, 0, _buff, 40 * _vertex_size, 3 * _vertex_size);
위 코드는 3D 위치 속성과 텍스처 좌표 속성으로 구성된 새로운 정점 형식을 생성합니다. 그런 다음 몇 가지 임시 변수를 초기화합니다: 루프 카운터, 소스 버퍼 및 단일 정점의 바이트 크기. (3 + 2)
는 위치를 저장하는 데 사용되는 세 개의 float 값과 UV 좌표를 저장하는 데 사용되는 두 개의 float 값을 나타냅니다. 버퍼는 무작위 값으로 채워져 총 51개의 무작위 위치 정점(또는 17개의 삼각형)을 생성합니다. 그 후, 버퍼의 처음 30개의 정점으로부터 새로운 정점 버퍼가 생성됩니다. 마지막으로, 이 정점 버퍼의 처음 세 정점이 원래 버퍼의 정점 인덱스 40, 41 및 42의 데이터로 업데이트됩니다.
활용 예제
- 정점 버퍼 초기화 및 업데이트
gml var vertex_buffer = vertex_create_buffer(); vertex_update_buffer_from_buffer(vertex_buffer, 0, source_buffer);
- 정점 데이터 복사
gml vertex_update_buffer_from_buffer(target_buffer, target_offset, source_buffer, source_offset, source_size);
- 정점 형식 변경 후 데이터 업데이트
gml vertex_format = vertex_format_end(); vertex_update_buffer_from_buffer(vertex_buffer, 0, new_source_buffer);
- 정점 버퍼 크기 조정
gml vertex_update_buffer_from_buffer(vertex_buffer, 0, source_buffer, 0, -1);
이와 같은 방식으로 vertex_update_buffer_from_buffer
함수를 활용하여 다양한 정점 버퍼 작업을 수행할 수 있습니다.