2017-05-24 3 views
0

Ich bin derzeit auf der Suche nach einem Algorithmus beschrieben in this Forschungspapier, aber ich bin auf einen Teil gestoßen, die mir unklar ist, wie es erreicht wurde.Binary OR Framebuffer Blending

Ein Raster wird definiert, indem eine Kamera oberhalb der Szene positioniert wird und ihr Sichtkegelstumpf eingestellt wird, um den zu voxelisierenden Bereich zu umschließen. Diese Kamera verfügt über ein zugeordnetes Ansichtsfenster mit (w, h) Dimensionen. Die Szene wird dann gerendert, wobei die Voxelisierung in dem Bildpuffer konstruiert wird. Ein Pixel (i, j) stellt eine Spalte in dem Gitter dar, und jedes Voxel innerhalb dieser Spalte ist unter Verwendung des k-ten Bits des RGBA-Werts des Pixels binär codiert. Daher repräsentiert das entsprechende Bild ein w × h × 32 Raster mit einem Bit Information pro Voxel. Dieses Bit zeigt an, ob ein Grundelement eine Zelle durchläuft oder nicht. Die Union von Voxeln, die dem k-ten Bit für alle Pixel entspricht, definiert eine Scheibe. Folglich wird das Bild/die Textur, die das Gitter codiert, als Slice-Map bezeichnet. Wenn ein Grundelement gerastert wird, wird ein Satz von Fragmenten erhalten. Ein Fragment-Shader wird verwendet, um die Position des Fragments in der Spalte basierend auf seiner Tiefe zu bestimmen. Das Ergebnis wird dann mit dem aktuellen Wert des Bildspeichers ODER-verknüpft.

Vermutlich würde man dies erreichen, indem die blend equation Einstellen eines binären OR zu verwenden, aber das ist nicht eine Option, und ich kann nicht einen Weg zu erreichen, ist es durch die Manipulation von glBlendFunc() + glBlendEquation()

sehen Außerdem ist es meines Wissens nicht möglich, den Framebuffer innerhalb des Fragment-Shaders zu lesen. Sie können eine Textur sowohl an den Shader als auch an den Framebuffer binden, aber der Zugriff darauf innerhalb des Shaders ist undefined behaviour wegen fehlender Synchronisation.

Das Papier gibt nicht an, ob OpenGL oder Direct-X verwendet wurde, aber zu best of my understanding hat es die gleichen glBlendEquation() Einschränkungen.

Fehle ich etwas?

Ich weiß, ich könnte einfach das gleiche Ergebnis in 32 Durchgänge erreichen.

+1

Der letzte Satz vor dem Absatz, den Sie Staaten zitiert: „Die voxelization Methode ist eine Erweiterung des Verfahrens GPU in [26] beschrieben“. Haben Sie den Aufsatz ["Fast Scene Voxelization and Applications" von Eisemann] (https://pdfs.semanticscholar.org/3ebc/c2e5199aef395f0c63aadb93c16056e6b20a.pdf) gelesen? Eine andere Methode wäre zum Beispiel [hier] (https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf), die Laden/Speichern von Bildern verwendet. – BDL

+0

Ja, ich dachte nur, dass ich das nach dem Posten der Frage tun würde, es erwähnt 'logische Operationen', das scheint das zu sein, was ich brauche. Ich habe die Antwort unten gepostet. – Robadob

Antwort

2

OpenGL hat eine separate glLogicOp() für die Durchführung logischer Operationen auf dem Framebuffer.

dazu konfiguriert und aktiviert

glLogicOp(GL_OR); 
glEnable(GL_COLOR_LOGIC_OP); 

Verwendung Obwohl das Flag GL_COLOR_LOGIC_OP die Dokumentation Diese Alpha-Werte decken auch impliziert.

ist es etwas besser in Zitat beschrieben 26

+1

Alternativ können Sie [diese Seite] (https://www.khronos.org/opengl/wiki/Logical_Operation) lesen. –