서페이스 생성 함수 (surface_create)
이 문서는 surface_create
함수에 대해 설명합니다. 이 함수는 새로운 서페이스를 생성하고 이를 반환합니다. 서페이스가 처음 생성될 때는 메모리의 특정 영역이 할당되기 때문에 "노이즈"가 포함될 수 있습니다. 따라서 사용하기 전에 draw_clear_alpha
와 같은 함수를 사용하여 서페이스를 초기화하는 것이 좋습니다.
자동 깊이 버퍼 생성이 활성화되어 있으면 (기본값), 서페이스에 깊이 버퍼와 스텐실 버퍼도 생성됩니다. 이는 surface_depth_disable
을 사용하여 비활성화할 수 있습니다. 모든 서페이스는 2의 거듭제곱 크기로 생성하는 것이 권장됩니다. 예를 들어, 16, 128, 512 또는 1024 픽셀 크기가 적합합니다. 특정 플랫폼(예: Windows 및 MacOS)에서는 반드시 필요하지 않지만, HTML5 및 모바일 장치에서는 필수적입니다. 이 점을 기억하지 않으면 나중에 문제가 발생할 수 있습니다.
서페이스 포맷
서페이스 데이터가 메모리에 저장될 포맷을 선택적으로 지정할 수 있습니다. 기본 포맷은 surface_rgba8unorm
입니다. 아래 표는 서페이스를 생성할 때 사용할 수 있는 포맷과 각 픽셀당 저장되는 데이터 양을 설명합니다.
서페이스 포맷 상수 | 설명 |
---|---|
surface_rgba8unorm (기본) | 4개의 채널(빨강, 초록, 파랑, 알파)을 지원하며 각 채널은 8비트입니다. 값의 범위는 0-255입니다. "unorm"은 셰이더에서 읽을 때 이 값들이 0-1 범위로 정규화됨을 의미합니다. |
surface_r8unorm | 1개의 채널(빨강)을 지원하며 8비트 값(0-255)을 가집니다. 이 포맷은 RGBA 포맷에 비해 공간을 1/4 차지합니다. 셰이더에서 읽을 때 빨강을 제외한 모든 채널은 0입니다. |
surface_rg8unorm | 위의 포맷과 유사하지만 2개의 채널(빨강, 초록)을 포함합니다. 각 채널은 8비트입니다. |
surface_rgba4unorm | 4개의 채널(빨강, 초록, 파랑, 알파)을 지원하며 각 채널은 4비트입니다. 값의 범위는 0-15입니다. |
surface_rgba16float | 4개의 채널(빨강, 초록, 파랑, 알파)을 지원하며 각 채널은 16비트 부동 소수점입니다. 높은 정밀도를 제공합니다. HDR에 사용될 수 있습니다. |
surface_r16float | 1개의 채널(빨강)을 지원하며 16비트 부동 소수점 값을 가집니다. 이 포맷은 RGBA 포맷에 비해 공간을 1/4 차지합니다. |
surface_rgba32float | 4개의 채널(빨강, 초록, 파랑, 알파)을 지원하며 각 채널은 32비트 부동 소수점입니다. 가장 높은 정밀도를 제공하지만 렌더링 속도가 느립니다. |
surface_r32float | 1개의 채널(빨강)을 지원하며 32비트 부동 소수점 값을 가집니다. |
함수 문법
surface_create(w, h, [format]);
인수 설명
인수 | 타입 | 설명 |
---|---|---|
w | Real | 생성할 서페이스의 너비 |
h | Real | 생성할 서페이스의 높이 |
format | 서페이스 포맷 상수 | 서페이스 데이터를 저장하는 데 사용할 포맷 (기본값: surface_rgba8unorm) |
반환값
서페이스 객체 또는 오류가 발생한 경우 -1을 반환합니다.
활용 예제
if (!surface_exists(surf)) {
surf = surface_create(1024, 1024);
surface_set_target(surf);
draw_clear_alpha(c_black, 0);
surface_reset_target();
view_surface_id[0] = surf;
}
위 코드는 서페이스가 존재하는지 확인하고, 존재하지 않을 경우 1024x1024 픽셀 크기의 서페이스를 생성하여 surf
변수에 할당합니다. 그 후, 새로운 서페이스를 그리기 위한 타겟으로 설정하고, 서페이스를 투명하게 초기화한 후, 다시 디스플레이로 그리기 위한 타겟을 리셋합니다. 마지막으로 서페이스를 뷰에 할당합니다.
// 서페이스를 생성하고 사용하는 예제
var mySurface = surface_create(512, 512);
if (mySurface != -1) {
surface_set_target(mySurface);
draw_clear_alpha(c_white, 1); // 흰색으로 초기화
// 추가적인 그리기 작업
surface_reset_target();
}
// 서페이스의 포맷을 지정하여 생성하는 예제
var mySurfaceRGBA = surface_create(256, 256, surface_rgba8unorm);
var mySurfaceR = surface_create(256, 256, surface_r8unorm);
// 서페이스를 사용하여 이미지 효과를 적용하는 예제
if (surface_exists(mySurface)) {
surface_set_target(mySurface);
draw_sprite(spr_image, 0, 0, 0);
// 추가적인 효과 적용
surface_reset_target();
}