Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

큰 세계 좌표

참고

큰 세계 좌표는 주로 3D 프로젝트에 유용합니다. 2D 프로젝트에서는 거의 필요하지 않습니다. 또한 3D 렌더링과 달리 현재 2D 렌더링은 큰 세계 좌표가 활성화된 경우 정밀도가 향상되는 이점을 얻지 못합니다.

왜 큰 세계 좌표를 사용하나요?

Godot에서 물리 시뮬레이션과 렌더링은 모두 부동 소수점 숫자에 의존합니다. 그러나 컴퓨팅에서 부동 소수점 숫자는 **정밀도와 범위**가 제한되어 있습니다. 이는 우주 또는 행성 규모의 시뮬레이션 게임과 같이 거대한 세계가 있는 게임에서 문제가 될 수 있습니다.

정밀도는 값이 ``0.0``에 가까울 때 가장 높습니다. ``0.0``에서 멀어질수록 값이 증가하거나 감소함에 따라 정밀도는 점점 낮아집니다. 이는 부동 소수점 숫자의 *지수*가 증가할 때마다 발생하며, 이는 부동 소수점 숫자가 2의 거듭제곱 값(2, 4, 8, 16, …)을 초과할 때 발생합니다. 이런 일이 발생할 때마다 숫자의 최소 단계가 *증가*하여 정밀도가 손실됩니다.

실제로 이는 플레이어가 월드 원점(2D 게임에서는 Vector2(0, 0), 3D 게임에서는 Vector3(0, 0, 0))에서 멀어짐에 따라 정밀도가 감소한다는 것을 의미합니다.

이러한 정밀도 손실로 인해 모델의 위치가 부동 소수점 숫자로 표시될 수 있는 가장 가까운 값에 맞춰지므로 세계 원점에서 멀리 떨어져 있을 때 객체가 "진동"하는 것처럼 나타날 수 있습니다. 이로 인해 플레이어가 세계 원점에서 멀리 떨어져 있을 때만 발생하는 물리적 결함이 발생할 수도 있습니다.

범위는 숫자에 저장할 수 있는 최소값과 최대값을 결정합니다. 플레이어가 이 범위를 넘어 이동하려고 하면 더 이상 이동할 수 없습니다. 그러나 실제로는 부동 소수점 정밀도가 범위보다 먼저 문제가 되는 경우가 거의 항상 있습니다.

범위와 정밀도(두 지수 간격 사이의 최소 단계)는 부동 소수점 숫자 유형에 따라 결정됩니다. 이론적 범위에서는 매우 높은 값을 단정밀도 부동소수점에 저장할 수 있지만 정밀도는 매우 낮습니다. 실제로 모든 정수 값을 표현할 수 없는 부동 소수점 유형은 그다지 유용하지 않습니다. 극단적인 값에서는 정밀도가 너무 낮아서 숫자가 두 개의 개별 정수 값을 서로 구별할 수도 없습니다.

이는 개별 정수 값이 부동 소수점 숫자로 표시될 수 있는 범위입니다.

  • 단정밀도 부동 소수점 범위(모든 정수를 나타냄): -16,777,216에서 16,777,216 사이

  • 배정밀도 부동 소수점 범위(모든 정수를 나타냄): -9조에서 9조 사이

범위

작은 따옴표

큰 따옴표

주석

[1; 2]

~0.0000001

~1e-15

정밀도는 0.0 근처에서 더 커집니다(이 표는 축약됨).

[2; 4]

~0.0000002

~1e-15

[4; 8]

~0.0000005

~1e-15

[8; 16]

~0.000001

~1e-14

[16; 32]

~0.000002

~1e-14

[32; 64]

~0.000004

~1e-14

[64; 128]

~0.000008

~1e-13

[128; 256]

~0.000015

~1e-13

[256; 512]

~0.00003

~1e-13

[512; 1024]

~0.00006

~1e-12

[1024; 2048]

~0.0001

~1e-12

[2048; 4096]

~0.0002

~1e-12

렌더링 아티팩트나 물리적 결함이 없는 1인칭 3D 게임에 대한 최대 권장 단정밀도 범위입니다.

[4096; 8192]

~0.0005

~1e-12

렌더링 아티팩트나 물리적 결함이 없는 3인칭 3D 게임에 대한 최대 권장 단정밀도 범위입니다.

[8192; 16384]

~0.001

~1e-12

[16384; 32768]

~0.0019

~1e-11

렌더링 아티팩트나 물리적 결함이 없는 하향식 3D 게임에 대한 최대 권장 단정밀도 범위입니다.

[32768; 65536]

~0.0039

~1e-11

모든 3D 게임에 대한 최대 권장 단정밀도 범위입니다. 일반적으로 이 지점을 지나면 이중 정밀도(큰 세계 좌표)가 필요합니다.

[65536; 131072]

~0.0078

~1e-11

[131072; 262144]

~0.0156

~1e-10

> 262144

> ~0.0313

~1e-10 (0.0000000001)

이 값을 초과하면 배정밀도가 단정밀도보다 훨씬 더 정확합니다.

단정밀도 부동 소수점을 사용하는 경우 제안된 범위를 벗어날 수 있지만 더 눈에 띄는 아티팩트가 발생하고 물리적 결함이 더 흔하게 발생합니다(예: 플레이어가 특정 방향으로 똑바로 걷지 않는 경우).

더 보기

자세한 내용은 부동 소수점 정밀도 설명 문서를 참조하세요.

세계 좌표의 작동 방식

큰 세계 좌표(**이중 정밀도 물리학**이라고도 함)는 엔진 내 모든 부동 소수점 계산의 정밀도 수준을 높입니다.

기본적으로 class_float`는 GDScript에서 64비트이지만 :ref:`class_Vector2, Vector3 및 :ref:`class_Vector4`는 32비트입니다. 이는 벡터 유형의 정밀도가 훨씬 더 제한된다는 것을 의미합니다. 이 문제를 해결하려면 Vector 유형에서 부동 소수점 숫자를 나타내는 데 사용되는 비트 수를 늘릴 수 있습니다. 결과적으로 정밀도가 기하급수적으로 증가합니다. 이는 최종 값이 단지 두 배 더 정확할 뿐 아니라 높은 값에서는 잠재적으로 수천 배 더 정확하다는 것을 의미합니다. 단정밀도 부동소수점에서 배정밀도 부동소수점으로 전환하면 표현할 수 있는 최대값도 크게 늘어납니다.

세계 원점에서 멀리 떨어져 있을 때 모델 스냅 문제를 피하기 위해 Godot의 3D 렌더링 엔진은 큰 세계 좌표가 활성화될 때 렌더링 작업의 정밀도를 높입니다. 셰이더는 성능상의 이유로 배정밀도 부동 소수점을 사용하지 않지만 `대체 솔루션 <https://github.com/godotengine/godot/pull/66178>`__은 단정밀도 부동 소수점을 사용하여 렌더링하기 위해 배정밀도를 에뮬레이트하는 데 사용됩니다.

참고

대규모 세계 좌표를 활성화하면 특히 32비트 CPU에서 성능 및 메모리 사용량이 저하됩니다. 실제로 필요한 경우에만 큰 세계 좌표를 활성화하십시오.

이 기능은 중급/고급 데스크톱 플랫폼에 맞게 조정되었습니다. 다른 방법(예: 초당 물리 틱 수 감소)으로 CPU 사용량을 줄이기 위한 조치를 취하지 않는 한, 대규모 세계 좌표는 저가형 모바일 장치에서 제대로 작동하지 않을 수 있습니다.

저사양 플랫폼에서는 배정밀도 물리 및 렌더링을 사용하지 않고도 대규모 세계를 허용하기 위해 원점 이동 접근 방식을 대신 사용할 수 있습니다. 원점 이동은 단정밀도 부동 소수점과 함께 작동하지만 특히 멀티플레이어 게임에서 게임 논리가 더 복잡해집니다. 따라서 이 페이지에서는 원점 이동에 대해 자세히 설명하지 않습니다.

큰 세계 좌표는 누구를 위한 것인가요?

일반적으로 3D 공간이나 행성 규모의 시뮬레이션 게임에는 큰 세계 좌표가 필요합니다. 이는 매우 빠른* 이동 속도를 지원해야 하지만 때로는 매우 느리고 *정확한 움직임도 지원해야 하는 게임으로 확장됩니다.

반면에 (성능상의 이유로) 실제로 필요할 때만 큰 세계 좌표를 사용하는 것이 중요합니다. 일반적으로 다음과 같은 경우 큰 세계 좌표가 필요하지 않습니다.

  • 2D 게임에서는 정밀도 문제가 일반적으로 눈에 띄지 않습니다.

  • 소규모 또는 중간 규모의 세계를 갖춘 게임.

  • 넓은 세계를 갖춘 게임이지만 중간에 로딩 시퀀스를 사용하여 여러 레벨로 나뉩니다. 성능 저하 없이 정밀도 문제를 방지하기 위해 월드 원점을 중심으로 각 레벨 부분을 중앙에 둘 수 있습니다.

  • *플레이 가능한 도보 영역*이 8192×8192미터(세계 원점을 중심으로)를 초과하지 않는 오픈 월드 게임입니다. 위 표에서 볼 수 있듯이 1인칭 게임의 경우에도 정밀도 수준은 해당 범위 내에서 허용됩니다.

의심스러운 경우 프로젝트에서 큰 세계 좌표를 사용할 필요가 없을 수도 있습니다. 참고로 대부분의 최신 AAA 오픈 월드 타이틀은 대규모 세계 좌표계를 사용하지 않으며 렌더링과 물리 모두에 여전히 단정밀도 부동 소수점을 사용합니다.

이 기능은 항상 전반적인 좌표에 적용됩니다.

이 프로세스에서는 사용하려는 편집기와 모든 내보내기 템플릿 바이너리를 다시 컴파일해야 합니다. 릴리스 모드에서만 프로젝트를 내보내려는 경우 디버그 내보내기 템플릿 컴파일을 건너뛸 수 있습니다. 어떤 경우든, 매번 프로젝트를 내보낼 필요 없이 대규모 정밀 세계를 테스트할 수 있도록 편집기 빌드를 컴파일해야 합니다.

각 대상 플랫폼에 대한 컴파일 지침은 Compiling 섹션을 참조하세요. 편집기 및 내보내기 템플릿을 컴파일할 때 precision=double SCons 옵션을 추가해야 합니다.

결과 바이너리의 이름은 .double 접미사로 지정되어 단정밀도 바이너리(정밀도 접미사가 없음)와 구별됩니다. 그런 다음 내보내기 대화 상자의 프로젝트 내보내기 사전 설정에서 바이너리를 사용자 정의 내보내기 템플릿으로 지정할 수 있습니다.

단정밀도와 배정밀도 빌드 간의 호환성

ResourceSaver 싱글톤를 사용하여 바이너리 리소스를 저장할 때 배정밀도 숫자를 사용하는 빌드를 사용하여 리소스를 저장한 경우 특수 플래그가 파일에 저장됩니다. 결과적으로 배정밀도 빌드로 전환하고 저장하면 디스크의 모든 바이너리 리소스가 변경됩니다.

단정밀도 및 배정밀도 빌드는 모두 이 특수 플래그를 사용하는 리소스에서 ResourceLoader 싱글톤 사용을 지원합니다. 이는 단정밀도 빌드가 배정밀도 빌드를 사용하여 저장된 리소스를 로드할 수 있고 그 반대의 경우도 가능하다는 것을 의미합니다. 텍스트 기반 리소스는 올바른 읽기를 위해 배정밀도 플래그가 필요하지 않으므로 배정밀도 플래그를 저장하지 않습니다.

알려진 비호환성

  • 네트워크로 연결된 멀티플레이어 게임에서는 서버와 모든 클라이언트가 동일한 빌드 유형을 사용하여 클라이언트 전체에서 정밀도가 일관되게 유지되도록 해야 합니다. 다른 빌드 유형을 사용하면 작동할 수도 있지만 다양한 문제가 발생할 수 있습니다.

  • GDExtension API는 배정밀도 빌드에서 호환되지 않는 방식으로 변경됩니다. 이는 배정밀도 빌드와 작동하려면 확장 프로그램을 다시 빌드해야 한다는 의미입니다. 확장 개발자 측에서는 precision=double``를 사용하여 GDExtension을 빌드할 ``REAL_T_IS_DOUBLE 정의가 활성화됩니다. real_t``는 단정밀도 빌드에서 ``float, 배정밀도 빌드에서 ``double``의 별칭으로 사용할 수 있습니다.

제한 사항

3D 렌더링 셰이더는 실제로 배정밀도 부동 소수점을 사용하지 않으므로 3D 렌더링 정밀도와 관련하여 몇 가지 제한 사항이 있습니다.

  • :ref:`삼면 매핑 <doc_standard_material_3d_triplanar_mapping>`은 정밀도 증가로 인한 이점을 얻지 못합니다. 삼면 매핑을 사용하는 재질은 세계 원점에서 멀리 떨어져 있을 때 눈에 띄는 지터링을 나타냅니다.

  • **로컬 좌표**가 비활성화된 GPUParticles3D 노드는 정밀도 향상의 이점을 얻지 못합니다. 이로 인해 월드 원점에서 멀리 떨어져 있을 때 눈에 보이는 파티클 스냅이 발생할 수 있습니다. **로컬 좌표**가 활성화된 노드와 CPUParticles3D 노드는 여전히 정밀도 향상의 이점을 누릴 수 있습니다.

  • skip_vertex_transform 또는 world_vertex_coords 렌더링 모드를 사용하는 셰이더는 정밀도 향상의 이점을 얻지 못합니다.

  • 배정밀도 빌드에서는 셰이더 fragment() 함수의 월드 공간 좌표를 뷰 공간에서 재구성할 수 없습니다. 예를 들면 다음과 같습니다.

    vec3 world = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
    

    대신 vertex() 함수에서 월드 공간 좌표를 계산하고 :ref:`varying<doc_shading_language_varyings>`를 사용하여 전달합니다. 예를 들면 다음과 같습니다.

    varying vec3 world;
    void vertex() {
        world = (MODEL_MATRIX * vec4(VERTEX, 1.0)).xyz;
    }
    

2D 렌더링은 현재 큰 세계 좌표가 활성화된 경우 정밀도가 향상되는 이점을 얻지 못합니다. 이로 인해 세계 원점에서 멀리 떨어져 있을 때 가시적 모델 스냅이 발생할 수 있습니다(일반적인 확대/축소 수준에서 수백만 픽셀부터 시작). 하지만 2D 물리 계산은 여전히 정밀도 향상의 이점을 누릴 수 있습니다.