И так, суть проблемы:
необходимо применить маску к фрагменту изображения, при этом сама маска - тоже фрагмент изображения.
Иными словами есть два изображения: большая картинка, и атлас с различными масками.
Проблемы с наложением маски для отдельных целых текстур нет, просто передам в шейдер вторую текстуру и в фрагментном шейдере объединяем цвет из первой текстуры с альфой из второй текстуры. Выборка из обоих текстур ведётся по одним текстурным координатам.
Ход моих мыслей такой: нужно передать в шейдер вторую пару текстурных координат, для выборки из второй текстуры.
фрагментный шейдер:
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoordImage;
varying vec2 v_texCoordMask;
uniform sampler2D u_image;
uniform sampler2D u_mask;
void main()
{
vec4 imageColor = texture2D(u_image, v_texCoordImage).rgba;
vec4 maskColor = texture2D(u_mask, v_texCoordMask).rgba;
gl_FragColor = vec4(imageColor.r, imageColor.g, imageColor.b, maskColor.a);
}
|
собственно текстуры передаем в шейдер из кода, а текстурные координаты из вершинного шейдера:
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec2 b_texCoord;
attribute vec4 a_color;
#ifdef GL_ES
varying lowp vec4 v_fragmentColor;
varying mediump vec2 v_texCoordImage;
varying mediump vec2 v_texCoordMask;
#else
varying vec4 v_fragmentColor;
varying vec2 v_texCoordImage;
varying vec2 v_texCoordMask;
#endif
void main()
{
gl_Position = CC_MVPMatrix * a_position;
v_fragmentColor = a_color;
v_texCoordImage = a_texCoord;
v_texCoordMask = b_texCoord;
}
|
Результат странный выходит, мб я что-то тут неправильно делаю?
У меня вот сомнения передадутся ли вторые текстурные координаты, ведь они принадлежат другому кваду...
Или нужно записать сначала в наш квад вторым уровнем текстурные координаты от другого квада?