깊이 텍스처 가져오기 (surface_get_texture_depth)
이 문서에서는 GameMaker에서 surface_get_texture_depth
함수를 사용하는 방법에 대해 설명합니다. 이 함수는 주어진 표면의 깊이 텍스처를 반환하며, 깊이 텍스처가 존재하지 않을 경우 -1을 반환합니다. 깊이 텍스처는 셰이더에서 사용하기 위해 texture_set_stage
에 전달될 수 있습니다. 깊이 값은 빨간 채널에 저장되며, 셰이더에서 다음과 같이 접근할 수 있습니다:
float depth = texture2D(depth_texture, v_vTexcoord).r;
원근 투영을 사용하여 깊이 버퍼에 쓸 때, 텍스처에 저장된 깊이 값은 선형적이지 않으므로, 사용자 정의 셰이더에서 값을 선형으로 변환해야 합니다. 이를 위해 다음과 같은 셰이더 함수를 사용할 수 있습니다.
셰이더 코드 예제
정점 셰이더
// 패스스루 정점 셰이더 코드와 동일
프래그먼트 셰이더
precision highp float; // 일부 플랫폼에서 필요할 수 있습니다!
varying vec2 v_vTexcoord;
uniform float u_fZParam;
// LinearizeDepth() 함수를 정의합니다.
// ...
void main() {
float depth = texture2D(gm_BaseTexture, v_vTexcoord).r;
depth = LinearizeDepth(depth, u_fZParam);
gl_FragColor = vec4(vec3(depth), 1.0);
}
위 코드에서 계산된 깊이 값은 모든 색상 채널(R, G 및 B)에 할당되어 그레이스케일 이미지를 출력합니다.
함수 문법
surface_get_texture_depth(surface)
인수 설명
인수 | 유형 | 설명 |
---|---|---|
surface | Surface | 깊이 텍스처를 가져올 표면 |
반환값
반환값 | 설명 |
---|---|
Texture | 깊이 텍스처 (또는 깊이 텍스처가 존재하지 않을 경우 -1) |
예제: 깊이 텍스처 표시하기
Create Event
znear = 1;
zfar = 15000;
zparam = zfar / znear;
u_zparam = shader_get_uniform(sh_display_depth, "u_fZParam");
view_enabled = true;
view_visible[0] = true;
camera_set_proj_mat(view_camera[0], matrix_build_projection_perspective_fov(-45, room_width/room_height, znear, zfar));
camera_set_view_mat(view_camera[0], matrix_build_lookat(room_width/2, room_height/2, 0, room_width/2, room_height/2, 1, 0, -1, 0));
Draw Event
gpu_set_ztestenable(true);
gpu_set_depth(1000);
draw_rectangle(100, 100, 200, 200, false);
gpu_set_depth(4000);
draw_circle(150, 300, 50, false);
gpu_set_depth(2000 + dsin(current_time * .1) * 1000);
draw_triangle(50, 160, 350, 50, 170, 300, false);
gpu_set_depth(14000 + dsin(current_time * .2) * 6000);
draw_triangle(650, 500, 900, 700, 1200, 800, false);
gpu_set_ztestenable(false);
Draw GUI Event
var _texture = surface_get_texture_depth(application_surface);
shader_set(sh_display_depth);
shader_set_uniform_f(u_zparam, zparam);
draw_primitive_begin_texture(pr_trianglestrip, _texture);
draw_vertex_texture(room_width/2, 0, 0, 0);
draw_vertex_texture(room_width, 0, 1, 0);
draw_vertex_texture(room_width/2, room_height/2, 0, 1);
draw_vertex_texture(room_width, room_height/2, 1, 1);
draw_primitive_end();
shader_reset();
위 코드는 원근 투영을 사용하여 깊이 버퍼를 활용하는 방법에 대한 확장된 예제를 보여줍니다. 몇 가지 도형이 애플리케이션 표면에 그려지고, 애플리케이션 표면의 깊이 텍스처가 검색되어 애플리케이션 표면 위에 그려집니다.
활용 예제
- 3D 게임에서 깊이 기반 효과 적용:
- 깊이 텍스처를 사용하여 그림자 효과를 구현할 수 있습니다.
- 포스트 프로세싱 효과:
- 깊이 정보를 사용하여 블러 효과나 깊이 기반의 색상 보정을 적용할 수 있습니다.
- VR 환경에서의 깊이 인식:
- VR 환경에서 깊이 정보를 활용하여 사용자 경험을 향상시킬 수 있습니다.
- 실시간 렌더링 최적화:
- 깊이 텍스처를 사용하여 불필요한 픽셀 렌더링을 줄여 성능을 최적화할 수 있습니다.
- 게임 내 UI 요소의 깊이 조정:
- UI 요소의 깊이를 조정하여 게임의 3D 공간에서 더 자연스럽게 보이도록 할 수 있습니다.