forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   iPhone (http://forum.boolean.name/forumdisplay.php?f=125)
-   -   [cocos2d-x][shaders] Шейдер маски для фрагментов текстур (http://forum.boolean.name/showthread.php?t=18929)

SBJoker 10.02.2014 21:38

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

moka 10.02.2014 21:51

Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
 
Вложений: 1
А как ты вычесляешь вторые текстурные координаты?
Я думаю тут нужно вычислять вторые координаты в фрагментном шейдере, исходя из смещения и скейла маски в атласе маск.
Тебе нужно передать данные о смещении и скейле, например:

Смещение на 25% влево и вверх, также размер 50% от оригинала. По сути тебе нужно знать % смещение и % размера между регионом маски и самим атласом маски. Эти 4 переменные передать в шейдер (maskX, maskY, maskW, mashH).
На примере картинки выше это будет:
PHP код:

maskX 0.25;
maskY 0.25;
maskW 0.5;
maskH 0.5

Далее формула будет такой:
PHP код:

vec2 v_textCoordMask = (v_texCoordImage vec2(maskXmaskY)) / vec2(maskWmaskH); 

Ну ты конечно передашь эти 4 данных одним vec4, но для наглядности они по отдельности. Будет у тебя что-то типо:
PHP код:

vec2 v_textCoordMask = (v_texCoordImage maskCoords.xy) / maskCoords.zw


SBJoker 10.02.2014 22:06

Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
 
суть такова:
Уже есть два квада, оба затекстурированы, так что UV мы можем снимать с вершин.
Но вопрос в том можем ли мы передавать в шейдер на первом кваде UV из второго как второй набор.

moka 10.02.2014 22:50

Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
 
Можешь, ты же можешь задать набор данных и замапить их в буффер вершин, что потом кормится шейдеру. Отрисуй текстурные координаты в фрагмент, и грянь если они "ОК".
Скрины бы помогли..

pax 11.02.2014 10:38

Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
 
В Unity под iOS если uv выходят за пределы +-2 по u или v то Unity ругается, возможно там такое ограничение. Не знаю, поможет или нет в данном случае...

SBJoker 11.02.2014 21:31

Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
 
Я решил себе упростить чуть-чуть задачу, маски в отдельных файлах теперь, это позволяет пересчитывать UV координаты по методу moka.

Четыре флоата сдвига и скейла фрагмента основной текстуры передаются в шейдер для пересчета в пространство текстурных координат маски, которые теперь лежат в удобном диапазоне (0,0)-(1,1)

В будущем постараюсь адаптировать к текстурным атласам и для масок тоже.

moka 11.02.2014 22:30

Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
 
Результат то покажи, ну там скринчики шейдеров чтоль.. :)


Часовой пояс GMT +4, время: 03:28.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot