Поскольку ваша маска является текстурой, буфер трафарета не очень хорошая идея.
- во время рендеринга маски вы должны использовать "discard;" для прозрачных пикселей в вашем фрагментном шейдере
- приветствуем проблемы сглаживания
Для вашего любопытства приведем код для настройки маски с буфером трафарета:
const bool invert_mask = false; // allow to draw inside or outside mask
unsigned mask_id = 1; // you can use this code multiple time without clearing stencil, just increment mask_id
glEnable(GL_STENCIL_TEST);
// write on stencil_mask
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilFunc(GL_ALWAYS, mask_id, 0);
// remove depth test and color writing
glDepthMask(GL_FALSE);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
// TODO: draw geometry of mask here. (if you use a texture, dont forget to use discard in the shader
// enabled depth & color writing
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
// no stencil write
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
// test stencil value
glStencilFunc(invert_mask ? GL_NOTEQUAL : GL_EQUAL, mask_id, 0xff);
// TODO: draw "clipped" geometry here
// finally, remove stencil test
glDisable(GL_STENCIL_TEST);
Самый простой способ - НЕ ИСПОЛЬЗОВАТЬ ТРАДИЦИЮ. Создайте текстуру в натуральную величину, напишите свою маску внутри. Затем свяжите его в свой фрагментный шейдер:
uniform LOW_P sampler2D u_diffuse_sampler;
uniform LOW_P sampler2D u_mask_sampler;
varying mediump vec2 v_texcoord;
void main(void) {
gl_FragColor = texture2D(u_diffuse_sampler, v_texcoord) * texture2D(u_mask_sampler, v_texcoord).r;
}