2017-08-28 2 views
1

Ich verstehe nicht, warum diese beiden Codes nicht das gleiche Ergebnis liefern. Ich habe eine gründlichere Prüfung freigegeben und Schablonentests und meine Hauptschleife sieht wie folgt aus:Stencil Puffer Verhalten im einfachen Fall (GL_ALWAYS, GL_LEQUAL)

myShader.Use() // Use shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// define model, projection, view, .... 
glBindVertexArray(VAO[0]); 
glStencilMask(0xFF); // Enable stencil buffer writing 
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawCube(&myShader, model, projection, view); 
glBindVertexArray(0); 

Offensichtlich mein Würfel macht in diesem Fall.

Allerdings, wenn ich diesen Code verwenden, macht nichts:

myShader.Use() // Use shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// define model, projection, view, .... 
glBindVertexArray(VAO[0]); 
glStencilMask(0xFF); // Enable stencil buffer writing 
glStencilFunc(GL_LEQUAL, 1, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawCube(&myShader, model, projection, view); 
glBindVertexArray(0); 

Mit nur einem Objekt in meiner Szene, sollten beide Code die gleiche Art und Weise verhalten. Aber es tut es nicht.

Ich dachte, es hatte etwas mit dem Standardwert im Stencil-Puffer zu tun. Da ich aber vor dies zu tun, den Stencilbuffer bin löschen, soll der Standardwert 0.

Durch die Art und Weise sein, mit diesem Code, macht der Würfel auch:

myShader.Use() // Use shader program 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
// define model, projection, view, .... 
glBindVertexArray(VAO[0]); 
glStencilMask(0xFF); // Enable stencil buffer writing 
glStencilFunc(GL_LEQUAL, 0, 0xFF); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
drawCube(&myShader, model, projection, view); 
glBindVertexArray(0); 

ich nicht verstehe was passiert.

Antwort

2

glStencilFunc(GL_LEQUAL, 1, 0xFF) bedeutet if 1 <= 0, weil der Stencil-Puffer 0 enthält, seit Sie es gelöscht haben. Der Referenzwert ist 1, weil Sie diesen Wert an die Funktion übergeben. Das schlägt immer fehl.

Siehe die Khronos Referenzseite (glStencilFunc):

GL_LEQUAL Pässe if (ref & mask) <= (stencil & mask).