Jelajahi Sumber

Fix NDC coordinates for Vulkan in Advanced post-processing

Hugo Locurcio 3 tahun lalu
induk
melakukan
4ba5a42f9c
1 mengubah file dengan 15 tambahan dan 8 penghapusan
  1. 15 8
      tutorials/shaders/advanced_postprocessing.rst

+ 15 - 8
tutorials/shaders/advanced_postprocessing.rst

@@ -86,7 +86,7 @@ the uniform variable ``DEPTH_TEXTURE``.
           possible when reading from the current viewport. The depth texture cannot be
           accessed from another viewport to which you have rendered.
 
-The values returned by ``DEPTH_TEXTURE`` are between ``0`` and ``1`` and are nonlinear.
+The values returned by ``DEPTH_TEXTURE`` are between ``0.0`` and ``1.0`` and are nonlinear.
 When displaying depth directly from the ``DEPTH_TEXTURE``, everything will look almost
 white unless it is very close. This is because the depth buffer stores objects closer
 to the camera using more bits than those further, so most of the detail in depth
@@ -97,15 +97,21 @@ inverse of the projection matrix, which in Godot, is accessible with the variabl
 ``INV_PROJECTION_MATRIX``.
 
 Firstly, take the screen space coordinates and transform them into normalized device
-coordinates (NDC). NDC run from ``-1`` to ``1``, similar to clip space coordinates.
+coordinates (NDC). NDC run ``-1.0`` to ``1.0`` in ``x`` and ``y`` directions and
+from ``0.0`` to ``1.0`` in the ``z`` direction when using the Vulkan backend.
 Reconstruct the NDC using ``SCREEN_UV`` for the ``x`` and ``y`` axis, and
 the depth value for ``z``.
 
+.. note::
+
+    This tutorial assumes the use of the Vulkan renderer, which uses NDCs with a Z-range
+    of ``[0.0, 1.0]``. In contrast, OpenGL uses NDCs with a Z-range of ``[-1.0, 1.0]``.
+
 .. code-block:: glsl
 
   void fragment() {
     float depth = texture(DEPTH_TEXTURE, SCREEN_UV).x;
-    vec3 ndc = vec3(SCREEN_UV, depth) * 2.0 - 1.0;
+    vec3 ndc = vec3(SCREEN_UV * 2.0 - 1.0, depth);
   }
 
 Convert NDC to view space by multiplying the NDC by ``INV_PROJECTION_MATRIX``.
@@ -176,11 +182,12 @@ Now, attach a script to the MeshInstance and use the following code:
     # Create mesh from mesh_array:
     mesh.add_surface_from_arrays(Mesh.PRIMITIVE_TRIANGLES, mesh_array)
 
-.. note:: The triangle is specified in normalized device coordinates. Recall, NDC run
-          from ``-1`` to ``1`` in both the ``x`` and ``y`` directions. This makes the screen
-          ``2`` units wide and ``2`` units tall. In order to cover the entire screen with
-          a single triangle, use a triangle that is ``4`` units wide and ``4``
-          units tall, double its height and width.
+.. note:: The triangle is specified in normalized device coordinates.
+          Recall, NDC run from ``-1.0`` to ``1.0`` in both the ``x`` and ``y``
+          directions. This makes the screen ``2`` units wide and ``2`` units
+          tall. In order to cover the entire screen with a single triangle, use
+          a triangle that is ``4`` units wide and ``4`` units tall, double its
+          height and width.
 
 Assign the same vertex shader from above and everything should look exactly the same.