Unity - Посібник Використання текстур глибини

Використання текстур глибини

Існує можливість створювати рендер текстури, де кожен піксель містить точне значення “глибини” (див. RenderTextureFormat.Depth). Це в основному використовується, коли для будь-яких ефектів потрібно, щоб глибина сцени була доступна (наприклад, для м'яких частинок, SSAO, напівпрозорості потрібно глибина сцени).

Значення пікселів у текстурі глибини перебувають у діапазоні від 0 до 1 із нелінійним поширенням. Точність зазвичай 24 або 16 біт, залежно від буфера глибини, що використовується. При зверненні до текстури глибини повертається високоточне значення в діапазоні від 0 до 1. Якщо вам потрібно отримати відстань від камери або лінійне значення, слід обчислювати це вручну.

Depth textures є supported на найбільш сучасний hardware and graphics APIs. Спеціальні вимоги будуть розраховані нижче:

  • У Direct3D 11 (Windows) є підтримка нативної текстури глибини так само, як і в OpenGL.
  • Direct3D 9 (Windows) потребує графіки driver to support “INTZ” texture format to get depth textures.
  • Відеокарта має підтримувати розширення GL_OES_depth_texture.
  • Відеокарта має підтримувати розширення GL_OES_depth_texture.
  • Direct3D 11 feature level 9.x (Common on Windows Phone devices) не підтримує глибину тексту.

Використання макросу-помічника текстури глибини

Більшість текстури глибини використовуються, щоб рендерувати глибину щодо камери. Файл UnityCG.cginc, що підключається, містить деякі макроси, щоб вирішувати ситуацію без додаткових складнощів:

  • UNITY_TRANSFER_DEPTH(o) : обчислює глибину вершин у просторі глядача і надає це значення змінної o (яка має бути типу float2).Використовуйте це у вершинній програмі, коли рендеруєте у текстуру глибини. На платформах з нативними глибинними текстурами цей макрос не робить абсолютно нічого, тому що значення Z-буфера беззастережно рендериться.
  • UNITY_OUTPUT_DEPTH(i) : повертає глибину простору глядача зі змінної i (яка має бути типу float2). Використовуйте це у фрагментній програмі, коли рендеруєте у текстуру глибини. На платформах із нативними текстурами глибини цей макрос повертає нуль, тому що значення Z-буфера беззастережно рендерується.
  • COMPUTE_EYEDEPTH(i) : обчислює глибину вершин у просторі глядача і видає значення змінну o . Використовуйте це у вершинних програмах, колине рендерите в текстуру глибини.
  • DECODE_EYEDEPTH(i) : дає високоточне значення текстури глибини i , повертає відповідну глибину простору глядача. У Direct3D цей макрос просто повертає i * FarPlane. На платформах з нативними текстурами глибини значення стає лінійним і розширюється до краю камери.

Наприклад, цей шейдер рендеруватиме глибину своїх об'єктів: