Показать сообщение отдельно
Старый 10.02.2014, 21:38   #1
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
[cocos2d-x][shaders] Шейдер маски для фрагментов текстур

И так, суть проблемы:
необходимо применить маску к фрагменту изображения, при этом сама маска - тоже фрагмент изображения.

Иными словами есть два изображения: большая картинка, и атлас с различными масками.

Проблемы с наложением маски для отдельных целых текстур нет, просто передам в шейдер вторую текстуру и в фрагментном шейдере объединяем цвет из первой текстуры с альфой из второй текстуры. Выборка из обоих текстур ведётся по одним текстурным координатам.

Ход моих мыслей такой: нужно передать в шейдер вторую пару текстурных координат, для выборки из второй текстуры.

фрагментный шейдер:
#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;
}
Результат странный выходит, мб я что-то тут неправильно делаю?
У меня вот сомнения передадутся ли вторые текстурные координаты, ведь они принадлежат другому кваду...
Или нужно записать сначала в наш квад вторым уровнем текстурные координаты от другого квада?
__________________
(Offline)
 
Ответить с цитированием