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 та встановіть властивість mesh на QuadMesh. Встановіть ширину та висоту квадрокоптера на 2.
Потім ви можете додати шейдер до вашого квадроцикла, щоб він покривав екран. Це робиться шляхом встановлення вбудованого значення POSITION вершинного шейдера на vec4(VERTEX.xy, 1.0, 1.0). Однак, під час створення ефекту, центрованого прямо попереду в полі зору користувача (наприклад, ефект віньєтки), кінцевий результат може виглядати неправильно в XR.
Нижче показано знімки ракурсу правого ока з віньєтковим шейдером, як з гарнітури, так і з самої цільової області рендерингу. Ліві знімки – це незмінений шейдер; праві знімки коригують повноекранний квадрокоптер за допомогою матриці проекції. Хоча знімок ліворуч центрований у цільовій області рендерингу, він нецентрований у ракурсі гарнітури. Але після застосування матриці проекції ми бачимо, що ефект центрований у самій гарнітурі.
Застосування проекційної матриці
Щоб правильно відцентрувати ефект, POSITION повноекранного квадроцикла має враховувати асиметричне поле зору. Щоб зробити це, а також забезпечити повне покриття квадроциклом усієї цільової області рендерингу, ми можемо поділити квадроцикл на поділки та застосувати матрицю проекції до внутрішніх вершин. Давайте збільшимо ширину та глибину поділу квадроцикла.
Потім, у функції vertex нашого шейдера, ми застосовуємо зміщення від матриці проекції до внутрішніх вершин. Ось приклад того, як це можна зробити за допомогою наведеного вище простого віньєткового шейдера:
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) та його призначення див. цей розділ Meta Asymetric Field of View FAQ.
Обмеження
Цей метод повноекранного ефекту не має проблем із продуктивністю для попіксельних ефектів, таких як вищезгаданий шейдер віньєтки. Однак не рекомендується зчитувати текстуру екрана під час використання цієї техніки. Повноекранні ефекти, які потребують зчитування текстури екрана, фактично вимикають усі оптимізації продуктивності рендерингу в XR. Це пояснюється тим, що під час зчитування текстури екрана Godot створює повну копію буфера рендерингу; це значно збільшує навантаження на графічний процесор і може створювати проблеми з продуктивністю.