Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   www.boolean.name > Программирование игр для мобильных телефонов > iPhone

iPhone Разработка игр на Objective-C

Ответ
 
Опции темы
Старый 10.02.2014, 17:38   #1
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,924
Написано 3,413 полезных сообщений
(для 9,325 пользователей)
[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, 17:51   #2
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: [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(maskXmaskY)) / vec2(maskWmaskH); 
Ну ты конечно передашь эти 4 данных одним vec4, но для наглядности они по отдельности. Будет у тебя что-то типо:
vec2 v_textCoordMask = (v_texCoordImage maskCoords.xy) / maskCoords.zw
Миниатюры
Нажмите на изображение для увеличения
Название: texCoords.png
Просмотров: 1309
Размер:	2.7 Кб
ID:	20126  
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
SBJoker (10.02.2014)
Старый 10.02.2014, 18:06   #3
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,924
Написано 3,413 полезных сообщений
(для 9,325 пользователей)
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур

суть такова:
Уже есть два квада, оба затекстурированы, так что UV мы можем снимать с вершин.
Но вопрос в том можем ли мы передавать в шейдер на первом кваде UV из второго как второй набор.
__________________
(Offline)
 
Ответить с цитированием
Старый 10.02.2014, 18:50   #4
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур

Можешь, ты же можешь задать набор данных и замапить их в буффер вершин, что потом кормится шейдеру. Отрисуй текстурные координаты в фрагмент, и грянь если они "ОК".
Скрины бы помогли..
(Offline)
 
Ответить с цитированием
Старый 11.02.2014, 06:38   #5
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,505
Написано 2,960 полезных сообщений
(для 5,247 пользователей)
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур

В Unity под iOS если uv выходят за пределы +-2 по u или v то Unity ругается, возможно там такое ограничение. Не знаю, поможет или нет в данном случае...
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Старый 11.02.2014, 17:31   #6
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,924
Написано 3,413 полезных сообщений
(для 9,325 пользователей)
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур

Я решил себе упростить чуть-чуть задачу, маски в отдельных файлах теперь, это позволяет пересчитывать UV координаты по методу moka.

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

В будущем постараюсь адаптировать к текстурным атласам и для масок тоже.
__________________
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
moka (11.02.2014)
Старый 11.02.2014, 18:30   #7
moka
.
 
Регистрация: 04.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,861 пользователей)
Ответ: [cocos2d-x][shaders] Шейдер маски для фрагментов текстур

Результат то покажи, ну там скринчики шейдеров чтоль..
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +1, время: 15:05.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com