GLSL Float positiv oder negativ?

Hallo,
diese Frage mag erst einmal komisch erscheinen, aber wie kann ich in GLSL sicher feststellen, ob ein Float positiv oder negativ ist? Manch einer kann sich vielleicht noch erinnern, ich möchte für die Weltgenerierung Dichtewerte in Bits umwandeln(positiv -> 1 und negativ -> 0). Ich habe 8 Dichtewerte, die testhalber alle negativ sein sollen, aber jetzt kommts: es kommt 10000000 raus!
Denn beim ersten Schleifendurchlauf des Wert-Arrays wechselt der Dichtewert 0 seinen wert von negativ zu positiv!!! Das erkenne ich folgendermaßen(Ausgaben mache ich mit Transform Feedback):


int[8] bits;
<Ausgabe1>
for(int i = 0; i < 8; i++){
	float value = densityValues**;
        <Ausgabe2>
	if(value > 0.0f){
                <Ausgabe3>
		bits** = 1;
	}else{
		bits** = 0;
	}
}

Jetzt kommt der Brüller:
Ausgabe1: Alle densityValues sind negativ.
Ausgabe2: value ist plötzlich positiv, aber nur wenn i = 0 ist (WARUM!?)
Ausgabe3: value ist wieder negativ
Das ist eigentlich unmöglich oder?
Es bringt mich echt zur Verzweiflung, weiß Irgendjemand entfernt, was es sein könnte? Alle Vorschläge erwünscht, bei diesem Problem können noch so absurde Lösungen funktionieren.

Hm. Mit transform feedback kenne ich mich nicht aus, aber … wie genau läuft da die Ausgabe ab? Eine “Ausgabe” von etwas, was auf der GPU passiert, ist heikel. Da arbeiten ja tausende Threads parallel. (Wirklich erklären würde es das beobachtete Verhalten nicht direkt, ich meine nur, dass da viel schiefgehen kann).

Ja, Du legst beim erstellen des Shaders Fest, welche Variable in den Transform Feedback Buffer geschrieben wird, ich habe gl_Position festgelegt. Dann zeichne ich so:

glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, outputVBO);

glBeginTransformFeedback(GL_TRIANGLES);
glBindVertexArray(vaoID);
glDrawArrays(GL_TRIANGLES, 0, 3);
glEndTransformFeedback();

Letztendlich kann ich dann aus dem “ouputVBO” Die Werte auslesen, die ich im Shader gesetzt habe, das sieht dann folgendermaßen aus:


int[8] bits;
gl_Position = vec4(densityValues[0], 0, 0, 0);
EmitVertex();
for(int i = 0; i < 8; i++){
	float value = densityValues**;
        gl_Position = vec4(value, 0, 0, 0);
        EmitVertex();
	if(value > 0.0f){
                gl_Position = vec4(value, 0, 0, 0);
                EmitVertex();
		bits** = 1;
	}else{
		bits** = 0;
	}
}
EndPrimitive();

Dann kommt da zum Beispiel sowas raus:


-5.0 0 0 0
 5.0 0 0 0
 5.0 0 0 0

Wenn ich die oberste Ausgabe ganz nach unten, nach der for eben, setzte, kommt sowas:


 5.0 0 0 0
 5.0 0 0 0
-5.0 0 0 0

Nun, abgesehen vom obligatorischen @Fancy werde ich da nicht viel sagen können - nur dass “EmitVertex” ja etwas MACHT, und es (auf dieser Ebene) zumindest nicht verwunderlich ist, wenn es einen Zustand verändert (und ich nicht sicher bin, ob es für “Debug-Ausgaben” geeignet ist…)

Das Problem ist, dass dieser Fehler auch ohne die Ausgaben auftritt, was sich durch völlig absurde und teilweise “Infinity” Werte in den generierten Dreiecken bemerkbar macht. Und ich persönlich weiß keine andere Methode, um irgendwie nen Shader zu debuggen.

Moin,

zu dem was bisher hier im Thread steht, kann ich auch nicht viel schreiben. if und > werden aber ziemlich sicher nicht den Fehler verursachen. Wo kommen denn die densityValues her, hast Du die mal probehalber als feste Werte im Shader definiert? Außerdem schreibt Dein Shader irgendwas zwischen 9 und 17 vec4 Werte in den Transform Feedback Buffer, wurde das berücksichtigt?

Transform Feedback eignet sich schon um Werte kontrollieren zu können.

Die Ausgabe im Geometrie Shader funktioniert als “function-based interface” dabei werden alle Ausgabevariablen mit Werten belegt und dann EmitVertex aufgerufen. Dadurch werden die Werte der Ausgabevariablen weitergereicht (hier in den TF Buffer geschrieben) und die Variablen selbst gehen in einen undefinierten Zustand über, müssen also vor dem nächsten EmitVertex neu beschrieben werden. Aber das passiert ja oben im Shader.

Gruß
Fancy

Ups, Sorry! Die Ausgaben in der Schleife werden mit einer if(i==0) versehen, weil die Änderung des Wertes ja nur beim ersten passiert. Und ich hab grad getestet: Wenn man feste Werte alle negativ definiert, dann wird alles richtig durch die if gebracht. Aber wenn ich Werte aus der Funktion -y nehme(Die eindeutig negativ sind), dann ändert sich der Wert.

Neue Erkenntnis: Wenn ich statt den vom Vertex Shader kommenden Positionen, feste Werte in die DichteFunktion eingebe, dann bleiben die Dichtewerte auch fest, und es kommt immer schön < 0 raus. Das ist aber wahrscheinlich eher verwirrend als hilfreich, aber interessant.

Ok, spontan hat wohl keiner eine Idee. Hier mal der Shadercode, vielleicht fällt ja jemandem irgend ein rudimentärer Fehler auf, ich arbeite an einem KSKB, da hängt aber ein bisschen was dran, also ich reich es nach!


#version 330

in vec4 positionvec[];

layout(triangles) in;
layout(triangle_strip, max_vertices = 18) out;

struct EdgeCase {
	int nr;
	ivec3[5] polygons;
};

const EdgeCase[256] TRIANGLE_TABLE = EdgeCase[](
	EdgeCase(0, ivec3[5](ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(0,8,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(0,1,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,8,3),ivec3(9,8,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(1,2,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,8,3),ivec3(1,2,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,2,10),ivec3(0,2,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(2,8,3),ivec3(2,10,8),ivec3(10,9,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(3,11,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,11,2),ivec3(8,11,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,9,0),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,11,2),ivec3(1,9,11),ivec3(9,8,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(3,10,1),ivec3(11,10,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,10,1),ivec3(0,8,10),ivec3(8,11,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(3,9,0),ivec3(3,11,9),ivec3(11,10,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,8,10),ivec3(10,8,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(4,7,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(4,3,0),ivec3(7,3,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,1,9),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(4,1,9),ivec3(4,7,1),ivec3(7,3,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,2,10),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(3,4,7),ivec3(3,0,4),ivec3(1,2,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,2,10),ivec3(9,0,2),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,10,9),ivec3(2,9,7),ivec3(2,7,3),ivec3(7,9,4),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(8,4,7),ivec3(3,11,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(11,4,7),ivec3(11,2,4),ivec3(2,0,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,0,1),ivec3(8,4,7),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(4,7,11),ivec3(9,4,11),ivec3(9,11,2),ivec3(9,2,1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(3,10,1),ivec3(3,11,10),ivec3(7,8,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,11,10),ivec3(1,4,11),ivec3(1,0,4),ivec3(7,11,4),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(4,7,8),ivec3(9,0,11),ivec3(9,11,10),ivec3(11,0,3),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(4,7,11),ivec3(4,11,9),ivec3(9,11,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(9,5,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,5,4),ivec3(0,8,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,5,4),ivec3(1,5,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(8,5,4),ivec3(8,3,5),ivec3(3,1,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,2,10),ivec3(9,5,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(3,0,8),ivec3(1,2,10),ivec3(4,9,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(5,2,10),ivec3(5,4,2),ivec3(4,0,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,10,5),ivec3(3,2,5),ivec3(3,5,4),ivec3(3,4,8),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,5,4),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,11,2),ivec3(0,8,11),ivec3(4,9,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,5,4),ivec3(0,1,5),ivec3(2,3,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,1,5),ivec3(2,5,8),ivec3(2,8,11),ivec3(4,8,5),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(10,3,11),ivec3(10,1,3),ivec3(9,5,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(4,9,5),ivec3(0,8,1),ivec3(8,10,1),ivec3(8,11,10),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(5,4,0),ivec3(5,0,11),ivec3(5,11,10),ivec3(11,0,3),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(5,4,8),ivec3(5,8,10),ivec3(10,8,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,7,8),ivec3(5,7,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,3,0),ivec3(9,5,3),ivec3(5,7,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,7,8),ivec3(0,1,7),ivec3(1,5,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,5,3),ivec3(3,5,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,7,8),ivec3(9,5,7),ivec3(10,1,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(10,1,2),ivec3(9,5,0),ivec3(5,3,0),ivec3(5,7,3),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(8,0,2),ivec3(8,2,5),ivec3(8,5,7),ivec3(10,5,2),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(2,10,5),ivec3(2,5,3),ivec3(3,5,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(7,9,5),ivec3(7,8,9),ivec3(3,11,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(9,5,7),ivec3(9,7,2),ivec3(9,2,0),ivec3(2,7,11),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,3,11),ivec3(0,1,8),ivec3(1,7,8),ivec3(1,5,7),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(11,2,1),ivec3(11,1,7),ivec3(7,1,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(9,5,8),ivec3(8,5,7),ivec3(10,1,3),ivec3(10,3,11),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(5,7,0),ivec3(5,0,9),ivec3(7,11,0),ivec3(1,0,10),ivec3(11,10,0))),
    EdgeCase(5, ivec3[5](ivec3(11,10,0),ivec3(11,0,3),ivec3(10,5,0),ivec3(8,0,7),ivec3(5,7,0))),
    EdgeCase(2, ivec3[5](ivec3(11,10,5),ivec3(7,11,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,8,3),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,0,1),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,8,3),ivec3(1,9,8),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,6,5),ivec3(2,6,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,6,5),ivec3(1,2,6),ivec3(3,0,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,6,5),ivec3(9,0,6),ivec3(0,2,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(5,9,8),ivec3(5,8,2),ivec3(5,2,6),ivec3(3,2,8),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(2,3,11),ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(11,0,8),ivec3(11,2,0),ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,1,9),ivec3(2,3,11),ivec3(5,10,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(5,10,6),ivec3(1,9,2),ivec3(9,11,2),ivec3(9,8,11),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(6,3,11),ivec3(6,5,3),ivec3(5,1,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,8,11),ivec3(0,11,5),ivec3(0,5,1),ivec3(5,11,6),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(3,11,6),ivec3(0,3,6),ivec3(0,6,5),ivec3(0,5,9),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(6,5,9),ivec3(6,9,11),ivec3(11,9,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(5,10,6),ivec3(4,7,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(4,3,0),ivec3(4,7,3),ivec3(6,5,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,9,0),ivec3(5,10,6),ivec3(8,4,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(10,6,5),ivec3(1,9,7),ivec3(1,7,3),ivec3(7,9,4),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(6,1,2),ivec3(6,5,1),ivec3(4,7,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,2,5),ivec3(5,2,6),ivec3(3,0,4),ivec3(3,4,7),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(8,4,7),ivec3(9,0,5),ivec3(0,6,5),ivec3(0,2,6),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(7,3,9),ivec3(7,9,4),ivec3(3,2,9),ivec3(5,9,6),ivec3(2,6,9))),
    EdgeCase(3, ivec3[5](ivec3(3,11,2),ivec3(7,8,4),ivec3(10,6,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(5,10,6),ivec3(4,7,2),ivec3(4,2,0),ivec3(2,7,11),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,1,9),ivec3(4,7,8),ivec3(2,3,11),ivec3(5,10,6),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(9,2,1),ivec3(9,11,2),ivec3(9,4,11),ivec3(7,11,4),ivec3(5,10,6))),
    EdgeCase(4, ivec3[5](ivec3(8,4,7),ivec3(3,11,5),ivec3(3,5,1),ivec3(5,11,6),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(5,1,11),ivec3(5,11,6),ivec3(1,0,11),ivec3(7,11,4),ivec3(0,4,11))),
    EdgeCase(5, ivec3[5](ivec3(0,5,9),ivec3(0,6,5),ivec3(0,3,6),ivec3(11,6,3),ivec3(8,4,7))),
    EdgeCase(4, ivec3[5](ivec3(6,5,9),ivec3(6,9,11),ivec3(4,7,9),ivec3(7,11,9),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(10,4,9),ivec3(6,4,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(4,10,6),ivec3(4,9,10),ivec3(0,8,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(10,0,1),ivec3(10,6,0),ivec3(6,4,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(8,3,1),ivec3(8,1,6),ivec3(8,6,4),ivec3(6,1,10),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,4,9),ivec3(1,2,4),ivec3(2,6,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(3,0,8),ivec3(1,2,9),ivec3(2,4,9),ivec3(2,6,4),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,2,4),ivec3(4,2,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(8,3,2),ivec3(8,2,4),ivec3(4,2,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(10,4,9),ivec3(10,6,4),ivec3(11,2,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,8,2),ivec3(2,8,11),ivec3(4,9,10),ivec3(4,10,6),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(3,11,2),ivec3(0,1,6),ivec3(0,6,4),ivec3(6,1,10),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(6,4,1),ivec3(6,1,10),ivec3(4,8,1),ivec3(2,1,11),ivec3(8,11,1))),
    EdgeCase(4, ivec3[5](ivec3(9,6,4),ivec3(9,3,6),ivec3(9,1,3),ivec3(11,6,3),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(8,11,1),ivec3(8,1,0),ivec3(11,6,1),ivec3(9,1,4),ivec3(6,4,1))),
    EdgeCase(3, ivec3[5](ivec3(3,11,6),ivec3(3,6,0),ivec3(0,6,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(6,4,8),ivec3(11,6,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(7,10,6),ivec3(7,8,10),ivec3(8,9,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,7,3),ivec3(0,10,7),ivec3(0,9,10),ivec3(6,7,10),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(10,6,7),ivec3(1,10,7),ivec3(1,7,8),ivec3(1,8,0),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(10,6,7),ivec3(10,7,1),ivec3(1,7,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,2,6),ivec3(1,6,8),ivec3(1,8,9),ivec3(8,6,7),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(2,6,9),ivec3(2,9,1),ivec3(6,7,9),ivec3(0,9,3),ivec3(7,3,9))),
    EdgeCase(3, ivec3[5](ivec3(7,8,0),ivec3(7,0,6),ivec3(6,0,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(7,3,2),ivec3(6,7,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,3,11),ivec3(10,6,8),ivec3(10,8,9),ivec3(8,6,7),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(2,0,7),ivec3(2,7,11),ivec3(0,9,7),ivec3(6,7,10),ivec3(9,10,7))),
    EdgeCase(5, ivec3[5](ivec3(1,8,0),ivec3(1,7,8),ivec3(1,10,7),ivec3(6,7,10),ivec3(2,3,11))),
    EdgeCase(4, ivec3[5](ivec3(11,2,1),ivec3(11,1,7),ivec3(10,6,1),ivec3(6,7,1),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(8,9,6),ivec3(8,6,7),ivec3(9,1,6),ivec3(11,6,3),ivec3(1,3,6))),
    EdgeCase(2, ivec3[5](ivec3(0,9,1),ivec3(11,6,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(7,8,0),ivec3(7,0,6),ivec3(3,11,0),ivec3(11,6,0),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(7,11,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(3,0,8),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,1,9),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(8,1,9),ivec3(8,3,1),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(10,1,2),ivec3(6,11,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,2,10),ivec3(3,0,8),ivec3(6,11,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(2,9,0),ivec3(2,10,9),ivec3(6,11,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(6,11,7),ivec3(2,10,3),ivec3(10,8,3),ivec3(10,9,8),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(7,2,3),ivec3(6,2,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(7,0,8),ivec3(7,6,0),ivec3(6,2,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(2,7,6),ivec3(2,3,7),ivec3(0,1,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,6,2),ivec3(1,8,6),ivec3(1,9,8),ivec3(8,7,6),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(10,7,6),ivec3(10,1,7),ivec3(1,3,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(10,7,6),ivec3(1,7,10),ivec3(1,8,7),ivec3(1,0,8),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,3,7),ivec3(0,7,10),ivec3(0,10,9),ivec3(6,10,7),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(7,6,10),ivec3(7,10,8),ivec3(8,10,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(6,8,4),ivec3(11,8,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(3,6,11),ivec3(3,0,6),ivec3(0,4,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(8,6,11),ivec3(8,4,6),ivec3(9,0,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(9,4,6),ivec3(9,6,3),ivec3(9,3,1),ivec3(11,3,6),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(6,8,4),ivec3(6,11,8),ivec3(2,10,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,2,10),ivec3(3,0,11),ivec3(0,6,11),ivec3(0,4,6),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(4,11,8),ivec3(4,6,11),ivec3(0,2,9),ivec3(2,10,9),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(10,9,3),ivec3(10,3,2),ivec3(9,4,3),ivec3(11,3,6),ivec3(4,6,3))),
    EdgeCase(3, ivec3[5](ivec3(8,2,3),ivec3(8,4,2),ivec3(4,6,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,4,2),ivec3(4,6,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,9,0),ivec3(2,3,4),ivec3(2,4,6),ivec3(4,3,8),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,9,4),ivec3(1,4,2),ivec3(2,4,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(8,1,3),ivec3(8,6,1),ivec3(8,4,6),ivec3(6,10,1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(10,1,0),ivec3(10,0,6),ivec3(6,0,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(4,6,3),ivec3(4,3,8),ivec3(6,10,3),ivec3(0,3,9),ivec3(10,9,3))),
    EdgeCase(2, ivec3[5](ivec3(10,9,4),ivec3(6,10,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(4,9,5),ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,8,3),ivec3(4,9,5),ivec3(11,7,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(5,0,1),ivec3(5,4,0),ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(11,7,6),ivec3(8,3,4),ivec3(3,5,4),ivec3(3,1,5),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,5,4),ivec3(10,1,2),ivec3(7,6,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(6,11,7),ivec3(1,2,10),ivec3(0,8,3),ivec3(4,9,5),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(7,6,11),ivec3(5,4,10),ivec3(4,2,10),ivec3(4,0,2),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(3,4,8),ivec3(3,5,4),ivec3(3,2,5),ivec3(10,5,2),ivec3(11,7,6))),
    EdgeCase(3, ivec3[5](ivec3(7,2,3),ivec3(7,6,2),ivec3(5,4,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(9,5,4),ivec3(0,8,6),ivec3(0,6,2),ivec3(6,8,7),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(3,6,2),ivec3(3,7,6),ivec3(1,5,0),ivec3(5,4,0),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(6,2,8),ivec3(6,8,7),ivec3(2,1,8),ivec3(4,8,5),ivec3(1,5,8))),
    EdgeCase(4, ivec3[5](ivec3(9,5,4),ivec3(10,1,6),ivec3(1,7,6),ivec3(1,3,7),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(1,6,10),ivec3(1,7,6),ivec3(1,0,7),ivec3(8,7,0),ivec3(9,5,4))),
    EdgeCase(5, ivec3[5](ivec3(4,0,10),ivec3(4,10,5),ivec3(0,3,10),ivec3(6,10,7),ivec3(3,7,10))),
    EdgeCase(4, ivec3[5](ivec3(7,6,10),ivec3(7,10,8),ivec3(5,4,10),ivec3(4,8,10),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(6,9,5),ivec3(6,11,9),ivec3(11,8,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(3,6,11),ivec3(0,6,3),ivec3(0,5,6),ivec3(0,9,5),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,11,8),ivec3(0,5,11),ivec3(0,1,5),ivec3(5,6,11),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(6,11,3),ivec3(6,3,5),ivec3(5,3,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,2,10),ivec3(9,5,11),ivec3(9,11,8),ivec3(11,5,6),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(0,11,3),ivec3(0,6,11),ivec3(0,9,6),ivec3(5,6,9),ivec3(1,2,10))),
    EdgeCase(5, ivec3[5](ivec3(11,8,5),ivec3(11,5,6),ivec3(8,0,5),ivec3(10,5,2),ivec3(0,2,5))),
    EdgeCase(4, ivec3[5](ivec3(6,11,3),ivec3(6,3,5),ivec3(2,10,3),ivec3(10,5,3),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(5,8,9),ivec3(5,2,8),ivec3(5,6,2),ivec3(3,8,2),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,5,6),ivec3(9,6,0),ivec3(0,6,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(1,5,8),ivec3(1,8,0),ivec3(5,6,8),ivec3(3,8,2),ivec3(6,2,8))),
    EdgeCase(2, ivec3[5](ivec3(1,5,6),ivec3(2,1,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(1,3,6),ivec3(1,6,10),ivec3(3,8,6),ivec3(5,6,9),ivec3(8,9,6))),
    EdgeCase(4, ivec3[5](ivec3(10,1,0),ivec3(10,0,6),ivec3(9,5,0),ivec3(5,6,0),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,3,8),ivec3(5,6,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(10,5,6),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(11,5,10),ivec3(7,5,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(11,5,10),ivec3(11,7,5),ivec3(8,3,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(5,11,7),ivec3(5,10,11),ivec3(1,9,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(10,7,5),ivec3(10,11,7),ivec3(9,8,1),ivec3(8,3,1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(11,1,2),ivec3(11,7,1),ivec3(7,5,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,8,3),ivec3(1,2,7),ivec3(1,7,5),ivec3(7,2,11),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(9,7,5),ivec3(9,2,7),ivec3(9,0,2),ivec3(2,11,7),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(7,5,2),ivec3(7,2,11),ivec3(5,9,2),ivec3(3,2,8),ivec3(9,8,2))),
    EdgeCase(3, ivec3[5](ivec3(2,5,10),ivec3(2,3,5),ivec3(3,7,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(8,2,0),ivec3(8,5,2),ivec3(8,7,5),ivec3(10,2,5),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(9,0,1),ivec3(5,10,3),ivec3(5,3,7),ivec3(3,10,2),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(9,8,2),ivec3(9,2,1),ivec3(8,7,2),ivec3(10,2,5),ivec3(7,5,2))),
    EdgeCase(2, ivec3[5](ivec3(1,3,5),ivec3(3,7,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,8,7),ivec3(0,7,1),ivec3(1,7,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(9,0,3),ivec3(9,3,5),ivec3(5,3,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,8,7),ivec3(5,9,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(5,8,4),ivec3(5,10,8),ivec3(10,11,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(5,0,4),ivec3(5,11,0),ivec3(5,10,11),ivec3(11,3,0),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,1,9),ivec3(8,4,10),ivec3(8,10,11),ivec3(10,4,5),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(10,11,4),ivec3(10,4,5),ivec3(11,3,4),ivec3(9,4,1),ivec3(3,1,4))),
    EdgeCase(4, ivec3[5](ivec3(2,5,1),ivec3(2,8,5),ivec3(2,11,8),ivec3(4,5,8),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(0,4,11),ivec3(0,11,3),ivec3(4,5,11),ivec3(2,11,1),ivec3(5,1,11))),
    EdgeCase(5, ivec3[5](ivec3(0,2,5),ivec3(0,5,9),ivec3(2,11,5),ivec3(4,5,8),ivec3(11,8,5))),
    EdgeCase(2, ivec3[5](ivec3(9,4,5),ivec3(2,11,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,5,10),ivec3(3,5,2),ivec3(3,4,5),ivec3(3,8,4),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(5,10,2),ivec3(5,2,4),ivec3(4,2,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(3,10,2),ivec3(3,5,10),ivec3(3,8,5),ivec3(4,5,8),ivec3(0,1,9))),
    EdgeCase(4, ivec3[5](ivec3(5,10,2),ivec3(5,2,4),ivec3(1,9,2),ivec3(9,4,2),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(8,4,5),ivec3(8,5,3),ivec3(3,5,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,4,5),ivec3(1,0,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(8,4,5),ivec3(8,5,3),ivec3(9,0,5),ivec3(0,3,5),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(9,4,5),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(4,11,7),ivec3(4,9,11),ivec3(9,10,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(0,8,3),ivec3(4,9,7),ivec3(9,11,7),ivec3(9,10,11),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(1,10,11),ivec3(1,11,4),ivec3(1,4,0),ivec3(7,4,11),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(3,1,4),ivec3(3,4,8),ivec3(1,10,4),ivec3(7,4,11),ivec3(10,11,4))),
    EdgeCase(4, ivec3[5](ivec3(4,11,7),ivec3(9,11,4),ivec3(9,2,11),ivec3(9,1,2),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(9,7,4),ivec3(9,11,7),ivec3(9,1,11),ivec3(2,11,1),ivec3(0,8,3))),
    EdgeCase(3, ivec3[5](ivec3(11,7,4),ivec3(11,4,2),ivec3(2,4,0),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(11,7,4),ivec3(11,4,2),ivec3(8,3,4),ivec3(3,2,4),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,9,10),ivec3(2,7,9),ivec3(2,3,7),ivec3(7,4,9),ivec3(-1,-1,-1))),
    EdgeCase(5, ivec3[5](ivec3(9,10,7),ivec3(9,7,4),ivec3(10,2,7),ivec3(8,7,0),ivec3(2,0,7))),
    EdgeCase(5, ivec3[5](ivec3(3,7,10),ivec3(3,10,2),ivec3(7,4,10),ivec3(1,10,0),ivec3(4,0,10))),
    EdgeCase(2, ivec3[5](ivec3(1,10,2),ivec3(8,7,4),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(4,9,1),ivec3(4,1,7),ivec3(7,1,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(4,9,1),ivec3(4,1,7),ivec3(0,8,1),ivec3(8,7,1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(4,0,3),ivec3(7,4,3),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(4,8,7),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,10,8),ivec3(10,11,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(3,0,9),ivec3(3,9,11),ivec3(11,9,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(0,1,10),ivec3(0,10,8),ivec3(8,10,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(3,1,10),ivec3(11,3,10),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(1,2,11),ivec3(1,11,9),ivec3(9,11,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(3,0,9),ivec3(3,9,11),ivec3(1,2,9),ivec3(2,11,9),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(0,2,11),ivec3(8,0,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(3,2,11),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(3, ivec3[5](ivec3(2,3,8),ivec3(2,8,10),ivec3(10,8,9),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(9,10,2),ivec3(0,9,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(4, ivec3[5](ivec3(2,3,8),ivec3(2,8,10),ivec3(0,1,8),ivec3(1,10,8),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(1,10,2),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(2, ivec3[5](ivec3(1,3,8),ivec3(9,1,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(0,9,1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(1, ivec3[5](ivec3(0,3,8),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1))),
    EdgeCase(0, ivec3[5](ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1),ivec3(-1,-1,-1)))
);

void buildVertex(int edge, float[8] densityValues, vec3 cubePos, int caseNumber){
		float x, y, z;
		 
		switch (edge) {
		 
        case 0:
            float d01 = -densityValues[0] / (densityValues[1] - densityValues[0]);
            x = 0;
            y = d01;
            z = 0;
            break;
 
        case 1:
 
            float d12 = -densityValues[1] / (densityValues[2] - densityValues[1]);
            x = d12;
            y = 1;
            z = 0;
            break;
 
        case 2:
        	 
            float d23 = -densityValues[2] / (densityValues[3] - densityValues[2]);
            x = 1;
                y = 1 - d23;
                z = 0;
            break;
 
        case 3:
 
            float d03 = -densityValues[0] / (densityValues[3] - densityValues[0]);
            x = d03;
            y = 0;
            z = 0;
            break;
 
 
        case 4:
 
            float d45 = -densityValues[4] / (densityValues[5] - densityValues[4]);
            x = 0;
            y = d45;
            z = 1;
            break;
 
        case 5:
 
            float d56 = -densityValues[5] / (densityValues[6] - densityValues[5]);
            x = d56;
            y = 1;
            z = 1;
            break;
 
        case 6:
            float d67 = -densityValues[6] / (densityValues[7] - densityValues[6]);
            x = 1;
                y = 1 - d67;
                z = 1;
            break;
 
        case 7:
 
            float d47 = -densityValues[4] / (densityValues[7] - densityValues[4]);
            x = d47;
            y = 0;
            z = 1;
            break;
 
        case 8:
 
            float d04 = -densityValues[0] / (densityValues[4] - densityValues[0]);
            x = 0;
            y = 0;
            z = d04;
            break;
 
        case 9:
 
            float d15 = -densityValues[1] / (densityValues[5] - densityValues[1]);
            x = 0;
            y = 1;
            z = d15;
            break;
 
        case 10:
 
            float d26 = -densityValues[2] / (densityValues[6] - densityValues[2]);
            x = 1;
            y = 1;
            z = d26;
            break;
 
        case 11:
 
            float d37 = -densityValues[3] / (densityValues[7] - densityValues[3]);
            x = 1;
            y = 0;
            z = d37;
            break;
 
        default:
        	x = 0;
        	y = 0;
        	z = 0;
 			break;
        }
 
        gl_Position = vec4(x+cubePos.x, y+cubePos.y, z+cubePos.z, 0);
        EmitVertex();
	}
	
float dichteFunktion(float x, float y, float z){
		float wert = y*-1.0f;
		return wert;
}	

void buildTriangle(float[8] densityValues, ivec3 edges, vec3 cubePos, int caseNumber){   
	buildVertex(edges.x, densityValues, cubePos, caseNumber);
	buildVertex(edges.y, densityValues, cubePos, caseNumber);
	buildVertex(edges.z, densityValues, cubePos, caseNumber);
	EndPrimitive();
}

int tabellenIndex(float[8] densityValues) {
    	int result = 0;
    	int[8] bits;
    	gl_Position = vec4(densityValues[0], 0, 0, 0);
		EmitVertex();
		for(int i = 0; i < 8; i++){
			float value = densityValues**;
			if(i==0){
				gl_Position = vec4(value, 0, 0, 0);
				EmitVertex();
			}
			if(value > 0.0f){
				if(i==0){
					gl_Position = vec4(densityValues[0], 0, 0, 0);
					EmitVertex();
				}
				bits** = 1;
			}else{
				bits** = 0;
			}
		}
		EndPrimitive();
        for (int i = 0; i < 8; i++)
            result |= bits** << i;
        return result;
}

void buildTriangles(float[8] werte, vec3 cubePos){
		int caseNumber = tabellenIndex(werte);
		EdgeCase triangles = TRIANGLE_TABLE[caseNumber];
		for (int i = 0; i < triangles.nr; i++)
			buildTriangle(werte, triangles.polygons**, cubePos, caseNumber);
}

void generateCube(vec4 pos){
	float werte[] = float[8](
		dichteFunktion(pos.x,   pos.y,   pos.z),
		dichteFunktion(pos.x+1, pos.y+1, pos.z),
		dichteFunktion(pos.x,   pos.y+1, pos.z),
		dichteFunktion(pos.x+1, pos.y,   pos.z),
		
		dichteFunktion(pos.x,   pos.y,   pos.z+1),
		dichteFunktion(pos.x,   pos.y+1, pos.z+1),
		dichteFunktion(pos.x+1, pos.y+1, pos.z+1),
		dichteFunktion(pos.x+1, pos.y,   pos.z+1)
	);
	buildTriangles(werte, vec3(pos));
}

void generate(){
		generateCube(positionvec[0]);
}

void main() {
	generate();
}

Ok, hier der KSKB-Code, ihr könnt ja mit den Ausgaben ein bisschen experimentieren. ich hoffe wirklich, es kommt was dabei raus, denn ich bin mit meinem Latein so was von am Ende:

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL32.*;
import static org.lwjgl.opengl.GL40.*;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.FloatBuffer;

import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.ContextAttribs;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.PixelFormat;

public class KSKB_TF {

	private int genShader;
	private int outputVBO;
	private int transformFeedback;
	private int query;
	private int vaoID;
	private int trianglesNumber;
	private int outputVAO;
	private int vboID;
	private String GEN_VERTEX = "#version 330 
"+
			"out vec4 positionvec; 
"+
			"layout (location = 0) in vec3 in_Position; 
"+
			"void main(){ 
"+
			"positionvec = vec4(in_Position, 0); 
"+
			"}";
	
	public KSKB_TF(){
		try {
	        final int GL_MAJOR_VERSION = 3;
	        final int GL_MINOR_VERSION = 3;
	        
	        final DisplayMode displayMode = new DisplayMode(10, 10);
	        final PixelFormat pixelFormat = new PixelFormat();
	        final ContextAttribs contextAttribs = new ContextAttribs(GL_MAJOR_VERSION, GL_MINOR_VERSION);
	        
	        Display.setDisplayMode(displayMode);
	        Display.create(pixelFormat, contextAttribs);
	        Display.setTitle("KSKB");
		} catch (LWJGLException e) {
	        e.printStackTrace();
	    }
		init();
		run();
	}
	
	public static void main(String[] args){
		new KSKB_TF();
	}
	
	public void init(){
		try{
		genShader = initShader(GEN_VERTEX, readFile("worldGenTest.geometry"));
		}catch(IOException e){
			e.printStackTrace();
		}
		vaoID = glGenVertexArrays();
		glBindVertexArray(vaoID);
		   
		FloatBuffer data = BufferUtils.createFloatBuffer(9);
		data.put(new float[]{0, 0, 0,  0, 0, 0,  0, 0, 0});
		data.flip();
		vboID = glGenBuffers();
		glBindBuffer(GL_ARRAY_BUFFER, vboID);
		glBufferData(GL_ARRAY_BUFFER, data, GL_STATIC_DRAW);
		   
		glEnableVertexAttribArray(0);
		glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0);
		glBindVertexArray(0);
		   
		outputVBO = glGenBuffers();
		transformFeedback = glGenTransformFeedbacks();
		query = glGenQueries();
	}
	
	public int initShader(String vertex, String geometry){
		int prog = glCreateProgram();
		
		int vs = glCreateShader(GL_VERTEX_SHADER);

	    glShaderSource(vs, vertex);
	    glCompileShader(vs);

	    if (GL_FALSE == glGetShaderi(vs, GL_COMPILE_STATUS)) {

	        final int length = glGetShaderi(vs, GL_INFO_LOG_LENGTH);
	        final String log = glGetShaderInfoLog(vs, length);

	        throw new RuntimeException("Fehler beim Vertexshader: "+log);

	    }
	    
	    int gs = glCreateShader(GL_GEOMETRY_SHADER);

	    glShaderSource(gs, geometry);
	    glCompileShader(gs);

	    if (GL_FALSE == glGetShaderi(gs, GL_COMPILE_STATUS)) {

	        final int length = glGetShaderi(gs, GL_INFO_LOG_LENGTH);
	        final String log = glGetShaderInfoLog(gs, length);

	        throw new RuntimeException("Fehler beim Geometryshader: "+log);

	    }
		glAttachShader(prog, vs);
		glAttachShader(prog, gs);
		glTransformFeedbackVaryings(prog, new String[]{"gl_Position"}, GL_INTERLEAVED_ATTRIBS);
		glLinkProgram(prog);
	    String log = glGetProgramInfoLog(prog, 65536);
	    if(log.length() != 0){
	        System.out.println("Program link log:
" + log);
	    }
	    glDeleteShader(vs);
	    glDeleteShader(gs);
		return prog;
	}
	
	public String readFile(String datei) throws IOException{
		String text;
		BufferedReader br = new BufferedReader(new InputStreamReader(KSKB_TF.class.getClassLoader().getResourceAsStream("worldGenTest.geometry")));
	    try {
	        StringBuilder sb = new StringBuilder();
	        String line = br.readLine();

	        while (line != null) {
	            sb.append(line);
	            sb.append(System.lineSeparator());
	            line = br.readLine();
	        }
	        text = sb.toString();
	    }finally {
	       br.close();
	    }
		return text;
	}
	
	public void run(){
		glEnable(GL_RASTERIZER_DISCARD);
	      glUseProgram(genShader);
	   	   	glBindBuffer(GL_ARRAY_BUFFER, outputVBO);
	   	   	glBufferData(GL_ARRAY_BUFFER, 5*4*12, GL_DYNAMIC_READ);
	   	   	glBindBuffer(GL_ARRAY_BUFFER, 0);
	   	   	
	    	glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, transformFeedback);
	        glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, outputVBO);
	        
	        glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, query);
	    	glBeginTransformFeedback(GL_TRIANGLES);
	        glBindVertexArray(vaoID);
	        glDrawArrays(GL_TRIANGLES, 0, 3);
	        glEndTransformFeedback();
	        glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);
	        System.out.println("Es wurden "+glGetQueryObjecti(query, GL_QUERY_RESULT)+" Dreiecke generiert");
	        trianglesNumber = glGetQueryObjecti(query, GL_QUERY_RESULT);
	        FloatBuffer feedback = BufferUtils.createFloatBuffer(glGetQueryObjecti(query, GL_QUERY_RESULT)*12);
	        glBindBuffer(GL_ARRAY_BUFFER, outputVBO);
	        glGetBufferSubData(GL_ARRAY_BUFFER, 0, feedback);
	        for(int i = 0; i < glGetQueryObjecti(query, GL_QUERY_RESULT)*12; i+=4){
	       	 	System.out.println(feedback.get(i)+" "+feedback.get(i+1)+" "+feedback.get(i+2)+" "+feedback.get(i+3));
	        }
	        if(trianglesNumber > 0)
	        System.out.println();
	        outputVAO = glGenVertexArrays();
	        glBindVertexArray(outputVAO);
	        
	        glBindBuffer(GL_ARRAY_BUFFER, outputVBO);
	        glVertexAttribPointer(0, 4, GL_FLOAT, false, 0, 0);
	        glEnableVertexAttribArray(0);
	}
}