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.