|
iPhone Разработка игр на Objective-C |
10.02.2014, 21:38
|
#1
|
Злобный Админ
Регистрация: 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)
|
|
10.02.2014, 21:51
|
#2
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
А как ты вычесляешь вторые текстурные координаты?
Я думаю тут нужно вычислять вторые координаты в фрагментном шейдере, исходя из смещения и скейла маски в атласе маск.
Тебе нужно передать данные о смещении и скейле, например:
Смещение на 25% влево и вверх, также размер 50% от оригинала. По сути тебе нужно знать % смещение и % размера между регионом маски и самим атласом маски. Эти 4 переменные передать в шейдер (maskX, maskY, maskW, mashH).
На примере картинки выше это будет:
maskX = 0.25; maskY = 0.25; maskW = 0.5; maskH = 0.5;
Далее формула будет такой:
vec2 v_textCoordMask = (v_texCoordImage - vec2(maskX, maskY)) / vec2(maskW, maskH);
Ну ты конечно передашь эти 4 данных одним vec4, но для наглядности они по отдельности. Будет у тебя что-то типо:
vec2 v_textCoordMask = (v_texCoordImage - maskCoords.xy) / maskCoords.zw;
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.02.2014, 22:06
|
#3
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
суть такова:
Уже есть два квада, оба затекстурированы, так что UV мы можем снимать с вершин.
Но вопрос в том можем ли мы передавать в шейдер на первом кваде UV из второго как второй набор.
__________________
|
(Offline)
|
|
10.02.2014, 22:50
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
Можешь, ты же можешь задать набор данных и замапить их в буффер вершин, что потом кормится шейдеру. Отрисуй текстурные координаты в фрагмент, и грянь если они "ОК".
Скрины бы помогли..
|
(Offline)
|
|
11.02.2014, 10:38
|
#5
|
Unity/C# кодер
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений (для 5,323 пользователей)
|
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
В Unity под iOS если uv выходят за пределы +-2 по u или v то Unity ругается, возможно там такое ограничение. Не знаю, поможет или нет в данном случае...
|
(Offline)
|
|
11.02.2014, 21:31
|
#6
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
Я решил себе упростить чуть-чуть задачу, маски в отдельных файлах теперь, это позволяет пересчитывать UV координаты по методу moka.
Четыре флоата сдвига и скейла фрагмента основной текстуры передаются в шейдер для пересчета в пространство текстурных координат маски, которые теперь лежат в удобном диапазоне (0,0)-(1,1)
В будущем постараюсь адаптировать к текстурным атласам и для масок тоже.
__________________
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
11.02.2014, 22:30
|
#7
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур
Результат то покажи, ну там скринчики шейдеров чтоль..
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:02.
|