Chcę używać bufora głębi w nieco nieortodoksyjny sposób i mocno mnie zdezorientował cały proces normalizacji, skalowania i tego, co się tam dzieje.Jak korzystać z bufora głębokości do przechowywania indeksów
Mój plan to implementacja algorytmu przestrzennego mieszania przez niektórych gości z AMD (link to pdf).
tl; dr-version: Przyspieszenie wyszukiwania najbliższego sąsiada poprzez dyskretyzację wierzchołków 3D do tablicy (głębi 2D) tekstury głębi, ustawienie głębi VertexID. Powodem używania tekstur głębi jest to, że istnieją pewne inteligentne testy głębokości, aby nawet uzyskać wyniki w posortowanej kolejności, ale tutaj jest to mniej ważne.
problem jest, że VertexID oczywiście liczbą całkowitą, od 0
całkowitej wysokości wierzchołków ParticleCount
, ale które nie mogą być bezpośrednio stosowane jako wyjście tego modułu wierzchołkowego ma być znormalizowana [-1..1)
OpenGL (lub [0..1)
w DirectX). Dlatego
Moja vertex shader robi coś takiego:
float depth = 2.0 * gl_VertexID/ParticleCount - 1.0;
gl_Position = vec4(flatCoords, depth, 1.0);
czyli niby działa, ale jakie wartości są właściwie przechowywane do głębokości tekstury związane z obecnym bufora ramki myli mnie. Nie całkiem dostaję różnicy między zmiennopozycyjnym buforem głębi a wersją całkowitą, jeśli nie mogę wyprowadzić rzeczywistych liczb całkowitych i kiedy odczytuję z głębi tekstury wszystko wydaje się być znormalizowane do [0..1]
bez względu na format wewnętrzny Ustawiłem (DepthComponent24, 32, 32f).
Czy ktoś może dać mi porady, w jaki sposób uzyskać VertexIDs z tych głębokości tekstury?
Dzięki
„* znormalizowany do [-1..1) w OpenGL (lub [0..1) w DirectX * "1 jest włączony w obu przypadkach. –
Masz rację, lekki niedopatrzenie. Jednak domyślne zachowanie testu głębokości polega na wyczyszczeniu bufora głębi na wartość 1 i porównaniu "mniej niż", dlatego wszystkie punkty o głębokości 1 są usuwane. – Gigo