Voglio usare il buffer di profondità in modo leggermente non ortodosso e sono stato pesantemente confuso da tutta la normalizzazione, il ridimensionamento e tutto ciò che accade lì.Come utilizzare il buffer di profondità per memorizzare gli indici
Il mio piano è di implementare un algoritmo di hashing spaziale da parte di alcuni ragazzi di AMD (link to pdf).
tl; dr-version: velocizza la ricerca del vicino più vicino, discretizzando i vertici 3D in una serie di trame di profondità (2D piatte), impostando la profondità sul VertexID. Il motivo per cui si utilizzano trame di profondità è che ci sono alcuni test di approfondimento intelligenti in corso per ottenere i risultati in un ordine ordinato, ma qui è meno importante.
mio problema è che il VertexID è ovviamente un numero intero, che vanno dal 0
alla quantità totale di vertici ParticleCount
, ma che non può essere utilizzato direttamente, come uscita del vertex deve essere normalizzati a [-1..1)
in OpenGL (o [0..1)
in DirectX).
mio vertex shader fa quindi qualcosa di simile:
float depth = 2.0 * gl_VertexID/ParticleCount - 1.0;
gl_Position = vec4(flatCoords, depth, 1.0);
Questo è tipo di lavorazione, ma quali valori sono in realtà memorizzati alla texture di profondità legata al framebuffer corrente mi confonde. Non ho proprio la differenza tra il depth buffer a virgola mobile e la versione intera, se non riesco nemmeno a produrre interi reali e durante la lettura dalla texture di profondità in seguito tutto sembra essere normalizzato a [0..1]
indipendentemente dal formato interno Ho impostato (DepthComponent24, 32, 32f).
Qualcuno può darmi qualche consiglio su come estrarre i VertexID da queste trame di profondità?
Grazie
"* normalizzato a [-1..1) in OpenGL (o [0..1) in DirectX * "L'1 è compreso in entrambi i casi. –
Hai ragione, una leggera svista. Ma il comportamento predefinito del test di profondità sta eliminando il buffer di profondità su 1 e utilizzando il confronto "minore di", quindi tutti i punti con una profondità di 1 vengono abbattuti. – Gigo