2017-07-17 2 views
3

Was ist der beste Weg, Alpha-Maske von überlappenden Objekten in OpenGL zu erhalten? Im ersten Bild unten habe ich drei Gitter, die sich mit dem Ellipsoid überlappen, der Tiefentest ist aktiviert. Mein Ziel ist es, ein Ergebnis ähnlich dem zweiten Bild zu erhalten, wobei das Weiß das Alpha darstellt. Unten sind die Tiefentestflags, die ich verwende.Alpha-Maske überlappender Objekte in OpenGL

glEnable(GL_DEPTH_TEST); 
glDepthMask(GL_TRUE); 
glDepthFunc(GL_LEQUAL); 

Main image

Alpha Mask

Antwort

2

Bevor Sie Ihre roten zeichnen, gelb und blau Gitter sollten Sie den Schablonentest aktivieren und Ihre Schablone Operationen glStencilOp Funktion wie folgt festgelegt:

glEnable(GL_STENCIL_TEST); 
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); 
glStencilFunc(GL_ALWAYS, 0, 1); // these are also the default parameters 

Dies bedeutet, dass der Schablonenpuffer wie gehalten wird ist, wenn der Tiefentest fehlschlägt und wenn der Tiefentest erfolgreich ist. Nach dem Zeichnen enthält der Stencil Buffer die Maske, wobei 0 für Schwarz und> 0 für Weiß steht. Stellen Sie sicher, dass der Stencil-Puffer vor dem Zeichnen gelöscht wird (glClear(GL_STENCIL_BUFFER_BIT)).

Wenn Sie diese Maske auf eine Textur bekommen Sie eine Textur Stencilpuffer zu binden:

GLint with = ...; 
GLint height = ...; 

GLuint depthAndStencilMap; 
glGenTextures(1, &depthAndStencilMap); 
glBindTexture(GL_TEXTURE_2D, depthAndStencilMap); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL, with, height, 0, GL_DEPTH_STENCIL, GL_FLOAT, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

GLuint frameBuffer; 
glGenFramebuffers(1, &frameBuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); 

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthAndStencilMap, 0); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

Bevor zeichnen Sie den Frame-Buffer binden und deaktivieren:

glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT) 

Nach dem Zeichnen der Textur enthält depthAndStencilMap den Tiefenpuffer im Rot Kanal und den Stencil-Puffer, der Ihre Maske ist, im 'Blue'-Kanal. Beachten Sie, dass die Szene zum Bildpuffer und nicht weiter zum Ansichtsfenster gezeichnet wird.

1

"beste" ist ein Wort mit vier Buchstaben;)

Sie könnten entweder

  1. die Puffer Schablone verwenden
    • klar auf 0/false für "nicht Ihre Gitter"
    • Schablone in 1/true für "Ihr-Grids"
  2. einen zweiten Durchgang zeichnen umfassen
    • nur die Objekte, die Sie in der Maske will
    • nicht löschen Sie den Tiefenpuffer
    • eine Tiefe verwenden == Test
    • verwendet einen anderen Fragment-Shader für „Ihr-Grids“
Verwandte Themen