kroonk
А поделись кодом плиз.. Ну или хотя бы расскажи идею как делать.. =)
Gladiator
Код не дам, тебе нужно самому учится писать его. А вот алгоритм - пожалуйста. Вычислить куда пихать паттерны по маске - проще простого, во фрагментном шейдере нужно цвет, полученный из текстуры паттерна умножить на цвет маски (соответственно белый цвет маски выдаст цвет пикселя текстуры паттерна, а черный выдаст нулевой цвет), при этом для функции чтения из текстуры паттерна нужно передать текстурные координаты умноженные по X на ширину маски и по Y на высоту маски. А вот чтобы узнать, как получить текстурные координаты для проективного текстурирования, обратись в гугл с запросом "projective texture mapping", он разъяснит лучше, чем я.
kroonk
Спасибо.
kroonk
> , при этом для функции чтения из текстуры паттерна нужно передать текстурные
> координаты умноженные по X на ширину маски и по Y на высоту маски
и что это будет ?
берем маску 2х2 и текстуру-паттерн 8х8. По тому, что ты говоришь получается что каждый 2-й пиксел я буду пропускать ? оО
Gladiator
Нет, не будешь ты ничего пропускать, понимаешь, видеокарта будет интерполировать значения между пересланными текстурными координатами и выберет нужные пиксели сама.
Добавлено:
Вот например здесь на каждом паттерне пропущено довольно много пикселей, так как камера находится далеко.
А здесь, не пропущено ни одного пикселя текстуры, даже наоборот их значения интерполировались, так как детализации не хватает на таком расстоянии.
как видишь, размер маски(здесь 16x16) не вызывает никакого "пропуска пикселей"
На случай, если надо будет на ходу что-нибудь менять...
Красная компонента - S-координата, зелёная компонента - Т-координата.
Минус решения - зависимая выборка из текстуры, снизит производительность.
Я так понимаю эта проблема не решаема с помощью шейдеров ?
Здесь ячейке соответствует 2х2 белых пикселя в маске. Сделано для того чтобы можно было наполовину сдвигать ячейки. Но проблему вы видите. =/
Роман Шувалов
Хочу воспользоваться тем что Вы говорили но немного по-другому..
Хочу реализовать вот это:
для того чтобы можно было делать клетку произвольных размеров и произвольного положения(в пределах дискретности сетки)
Только вот я не знаю как этого добиться..
Я хочу сделать следующий алгоритм ну или технологию(наверное алгоритм здесь не совсем уместно говорить) :
Вот это последнее я и не знаю как сделать..
Сделать еще одну заранее заполненную текстуру и умножить на этот заранее предопределенный паттерн ? Но тогда надо как-то проецировать одну текстуру на другую или как ? Я немного запутался..
Gladiator
Scale9Sprite реализуется элементарно - можешь посмотреть код в том же кокосе, из которого выдернул эту картинку.
Причем там необязательно части кратны 3м для исходной текстуры.
CasDev
Ты вообще читал что я писал ? ) Я реализовывал эту технологию на плюсах в своё время. И ничего сложного там нет. Но видишь ли беседа идёт о шейдерах, и это уже совсем другой разговор
Gladiator
Ну тогда хоть напиши смысл этого ваяния?
где ты это будешь применять. Я у себя оставлю в заметках и когда начнется речь о человеческой глупости и велосипедалировании - буду кидать ссылку :)
CasDev
Просто есть задача и надо ее сделать. Подробности здесь ни к чему.
Так.. Заранее извиняюсь что мелко нарисовано, просто рисовал в Паинте
Итак первая картинка собсно показывает структуру. Одна логическая клетка состоит как минимум из 4-х уголков, в каждом из которых хранится текстурная координата. В моём случае шаг дискретности равен двум. Можно еще более детализировать, в зависимости от нужд. Вот. Справа нарисовано чем это может стать в простейшем случае, ну а снизу просто показано что клетки могут смещаться друг относительно друга и так как у меня шаг дискретности 2, то я могу сместиться относительно другой клетки на 1/2 ее ширины/высоты, если шаг дискретности 3 до на 1/3 и так далее..
беда нынче с шойдеро-писателями )
Тема в архиве.