Ich möchte den Tiefenpuffer auf eine etwas unorthodoxe Art und Weise verwenden und ich wurde durch die gesamte Normalisierung, Skalierung und was auch immer dort passiert, sehr verwirrt.Wie verwende ich Tiefenpuffer, um Indizes zu speichern
Mein Plan ist es, einen räumlichen Hash-Algorithmus von einigen Jungs von AMD zu implementieren (link to pdf).
tl; dr-version: Beschleunigen Sie die Nearest-Neighbor-Suche, indem Sie 3D-Scheitelpunkte in ein Array von (flachen 2D) Tiefenstrukturen diskretisieren und die Tiefe auf die VertexID festlegen. Der Grund für die Verwendung von Tiefen-Texturen ist, dass es einige intelligente Tiefen-Tests gibt, um die Ergebnisse in einer sortierten Reihenfolge zu erhalten, aber das ist hier weniger wichtig.
Mein Problem ist, dass die VertexID offensichtlich eine ganze Zahl ist, von 0
auf die Gesamtmenge von Vertices Bereich ParticleCount
, aber das nicht direkt verwendet werden kann, da der Ausgang des Vertex-Shader zu [-1..1)
in OpenGL werden normalisierte (oder [0..1)
in DirectX).
Mein Vertex-Shader hat also etwas wie folgt aus:
float depth = 2.0 * gl_VertexID/ParticleCount - 1.0;
gl_Position = vec4(flatCoords, depth, 1.0);
Diese Art von Arbeit ist, aber welche Werte tatsächlich gespeichert sind, in die Tiefe Textur auf die aktuelle Framebuffer verwirrt mich gebunden. Ich erhalte nicht den Unterschied zwischen dem Fließkomma-Tiefenpuffer und der Integer-Version, wenn ich nicht einmal echte Ganzzahlen ausgeben kann und wenn ich später aus der Tiefenstruktur lese, scheint alles auf [0..1]
normalisiert zu sein, egal welches interne Format Ich setze (DepthComponent24, 32, 32f).
Kann mir jemand einen Rat geben, wie man die VertexIDs aus diesen Tiefenstrukturen herausholt?
Dank
„* normalisiert auf [-1..1) in OpenGL (oder [0..1) in DirectX * "Die 1 ist in beiden Fällen inklusive. –
Sie haben Recht, ein leichtes Versehen. Aber das Standardverhalten des Tiefentests löscht den Tiefenpuffer auf 1 und verwendet einen "weniger als" Vergleich, daher werden alle Punkte mit einer Tiefe von 1 gekeult. – Gigo