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.

XR 全螢幕效果

在 XR 應用程式中加入自訂的全螢幕效果時,一種做法是使用覆蓋全螢幕的四邊形,並將效果套用至該四邊形的著色器。請在場景中、你的 XRCamera3D 節點下新增一個 MeshInstance3D 節點,將其 mesh 屬性設為 QuadMesh,並將四邊形的寬與高設為 2

../../_images/xr_full_screen_effects_starting_quad.webp

接著替四邊形加入著色器,讓它覆蓋整個畫面。方法是將頂點著色器的內建 POSITION 設為 vec4(VERTEX.xy, 1.0, 1.0)。然而,當你要製作一個在使用者視野正前方置中的效果(例如暗角)時,最終結果在 XR 中可能會看起來不正確。

下方展示了右眼視圖使用暗角著色器的擷取畫面,包含來自頭戴裝置與算繪目標本身的影像。左側是未修改的著色器;右側則是使用投影矩陣調整過的全螢幕四邊形。左側影像雖在算繪目標中置中,但在頭戴裝置中卻偏離中心;在套用投影矩陣後,效果就會在頭戴裝置中正確置中。

../../_images/xr_full_screen_effects_vignette_before_after.webp

套用投影矩陣

要讓效果正確置中,必須在全螢幕四邊形的 POSITION 中考量非對稱視野。為了同時確保四邊形仍能完整覆蓋整個算繪目標,我們可以將四邊形細分,並將投影矩陣套用到內部的頂點。先將四邊形的細分寬度與深度調高。

../../_images/xr_full_screen_effects_ending_quad.webp

接著在著色器的頂點函式中,將投影矩陣導出的偏移套用到內部頂點。以下示範如何在上面的簡單暗角著色器中完成這件事:

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;
}

備註

關於非對稱視野及其用途的更多資訊,請參考此文件:Meta Asymmetric Field of View FAQ

限制

上述這種全螢幕效果的做法,對於像是暗角這類逐像素效果而言沒有效能疑慮。然而,不建議在使用此技巧時從螢幕紋理進行讀取。需要讀取螢幕紋理的全螢幕效果,會實際上停用 XR 中所有的算繪效能最佳化。原因在於,一旦需要讀取螢幕紋理,Godot 會完整拷貝算繪緩衝區,這會大幅增加 GPU 的工作量並引發效能問題。