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. На платформах з нативними текстурами глибини значення стає лінійним і розширюється до краю камери.
Наприклад, цей шейдер рендеруватиме глибину своїх об'єктів: