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 應用程式中加入自訂的全螢幕效果時,一種做法是使用覆蓋全螢幕的四邊形,並將效果套用至該四邊形的著色器。請在場景中、你的 XRCamera3D 節點下新增一個 MeshInstance3D 節點,將其 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;
}
備註
關於非對稱視野及其用途的更多資訊,請參考此文件:Meta Asymmetric Field of View FAQ。
限制
上述這種全螢幕效果的做法,對於像是暗角這類逐像素效果而言沒有效能疑慮。然而,不建議在使用此技巧時從螢幕紋理進行讀取。需要讀取螢幕紋理的全螢幕效果,會實際上停用 XR 中所有的算繪效能最佳化。原因在於,一旦需要讀取螢幕紋理,Godot 會完整拷貝算繪緩衝區,這會大幅增加 GPU 的工作量並引發效能問題。