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.
Checking the stable version of the documentation...
XR 전체 화면 효과
XR 애플리케이션에 사용자 정의 전체 화면 효과를 추가할 때 한 가지 접근 방식은 전체 화면 쿼드를 사용하고 해당 쿼드의 셰이더에 효과를 적용하는 것입니다. MeshInstance3D 노드를 XRCamera3D <class_XRCamera3D>`의 하위 항목으로 씬에 추가하고 ``mesh` 속성을 QuadMesh. 쿼드의 너비와 높이를 ``2``로 설정합니다.
그런 다음 쿼드에 셰이더를 추가하여 화면을 덮을 수 있습니다. 이는 내장된 정점 셰이더의 ``POSITION``를 ``vec4(VERTEX.xy, 1.0, 1.0)``로 설정하여 수행됩니다. 그러나 사용자 보기의 중앙에 있는 효과(예: 비네팅 효과)를 생성하면 XR에서 최종 결과가 올바르지 않게 나타날 수 있습니다.
아래에는 헤드셋과 렌더링 대상 자체 모두에서 비네팅 셰이더가 포함된 오른쪽 눈 보기의 캡처가 나와 있습니다. 왼쪽 캡처는 수정되지 않은 셰이더입니다. 오른쪽 캡처는 프로젝션 매트릭스를 사용하여 전체 화면 쿼드를 조정합니다. 왼쪽의 캡처는 렌더링 대상의 중앙에 있지만 헤드셋 보기에서는 중앙에서 벗어났습니다. 그러나 투영 행렬을 적용한 후에는 효과가 헤드셋 자체의 중심에 있음을 알 수 있습니다.
애니메이션 만들기
효과의 중심을 적절하게 맞추려면 전체 화면 쿼드의 ``POSITION``는 비대칭 시야를 고려해야 합니다. 이를 수행하는 동시에 쿼드가 전체 렌더 타겟을 완전히 커버하도록 보장하기 위해 쿼드를 세분화하고 투영 행렬을 내부 정점에 적용할 수 있습니다. 쿼드의 세분화된 너비와 깊이를 늘려보겠습니다.
그런 다음 셰이더의 정점 함수에서 투영 행렬의 오프셋을 내부 정점에 적용합니다. 다음은 위의 간단한 비네팅 셰이더를 사용하여 이 작업을 수행하는 방법에 대한 예입니다.
shader_type spatial;
render_mode depth_test_disabled, skip_vertex_transform, unshaded, cull_disabled;
// Modify VERTEX.xy using the projection matrix to correctly center the effect.
void vertex() {
vec2 vert_pos = VERTEX.xy;
if (length(vert_pos) < 0.99) {
vec4 offset = PROJECTION_MATRIX * vec4(0.0, 0.0, 1.0, 1.0);
vert_pos += (offset.xy / offset.w);
}
POSITION = vec4(vert_pos, 1.0, 1.0);
}
void fragment() {
ALBEDO = vec3(0.0);
ALPHA = dot(UV * 2.0 - 1.0, UV * 2.0 - 1.0) * 2.0;
}
참고
비대칭 FOV 및 그 목적에 대한 자세한 내용은 이 `보기 FAQ의 메타 비대칭 필드 <https://developers.meta.com/horizon/documentation/unity/unity-asymmetric-fov-faq/>`_를 참조하세요.
제한 사항
이 전체 화면 효과 방법은 위의 비네팅 셰이더와 같은 픽셀당 효과에 대한 성능 문제가 없습니다. 그러나 이 기술을 사용할 때 화면 텍스처에서 읽는 것은 권장되지 않습니다. 화면 텍스처에서 읽어야 하는 전체 화면 효과는 XR의 모든 렌더링 성능 최적화를 효과적으로 비활성화합니다. 이는 화면 텍스처에서 읽을 때 Godot가 렌더 버퍼의 전체 복사본을 만들기 때문입니다; 이로 인해 GPU의 작업 부하가 크게 증가하고 성능 문제가 발생할 수 있습니다.