Avant de dessiner votre rouge, jaune et grilles bleues vous devez activer le test de gabarit et définissez vos opérations de pochoir glStencilOp fonction comme ceci:
glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_INCR);
glStencilFunc(GL_ALWAYS, 0, 1); // these are also the default parameters
Cela signifie que le stencil buffer est conservé tel quel est si le test de profondeur échoue et augmente si le test de profondeur passe. Après avoir dessiné le tampon stencil contient le masque, où 0 signifie noir et> 0 signifie blanc dans votre cas. Vérifiez que votre tampon stencil doit être effacé avant de dessiner (glClear(GL_STENCIL_BUFFER_BIT)
).
Si vous devez obtenir ce masque à une texture, vous devez lier une texture au tampon pochoir:
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);
Avant de dessiner, vous devez lier et vider la mémoire tampon de trame:
glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)
Après avoir dessiné la texture depthAndStencilMap
contient le tampon de profondeur dans le canal Red et le tampon stencil, qui est votre masque, dans le canal 'Blue'. Notez que la scène est dessinée dans le tampon d'image et pas plus loin que la fenêtre d'affichage.