Это проще всего сделать с помощью фрагментного шейдера:
uniform sampler2D image;
uniform sampler2D mask;
varying vec2 texcoord;
void main()
{
gl_FragColor.a = texture2D(mask, texcoord);
/* we use pre multiplied alpha */
gl_FragColor.rgb = texture2D(image, texcoord) * gl_FragColor.a;
}
Объедините это с glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
, и вы получите то, что хотите.Если вы не можете или не хотите использовать шейдеры, это можно сделать с помощью мультитекстурирования и среды объединения текстур:
(прошло очень много времени с тех пор, как я в последний раз использовал объединители текстур,, нет, вероятно, будут некоторые ошибки):
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_TEXTURE0);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE1);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_ALPHA);
И тогда вам также придется жонглировать текстурными блоками и другими непонятными переключателями состояний.Лично я предпочитаю шейдеры.