Как заменить цвета на текстуры с помощью шейдеров в Unity 3D - PullRequest
0 голосов
/ 04 мая 2019

У меня проблема. Я пытался найти, но не могу найти то, что хочу. У меня есть текстура. Эта текстура имеет синий, зеленый и черный цвета. Это маски, на самом деле это текстура лица. Я хочу заменить их, как синий цвет заменит текстуру моих глаз в единстве, зеленый цвет заменит текстуру лица. Как я могу написать этот шейдер? Я искал, но только я нашел шейдеры, меняющие цвет :( Спасибо ..

1 Ответ

0 голосов
/ 07 мая 2019

То, как я интерпретирую ваш вопрос, заключается в том, что вам нужен шейдер, в котором одна текстура служит маской, смешиваясь между 3 другими текстурами.Я предполагаю, что это для настройки персонажа, чтобы соединить разные части лица.

В функции фрагмента (или прибоя), сэмплируйте 3 текстуры и маску:

fixed4 face = tex2D(_FaceTex, i.uv); // Green channel of the mask
fixed4 eyes = tex2D(_EyeTex, i.uv); // Blue channel of the mask
fixed4 mouth = tex2D(_MouthTex, i.uv); // No mask value (black)
fixed4 mask = tex2D(_MaskTex, i.uv);

Затем вам нужно смешать их вместе с помощью маски.Давайте предположим, что все, что черный представляет в маске, является цветом фона, и затем мы интерполируем в других текстурах.

fixed4 col = lerp(mouth, eyes, mask.b);

Затем мы можем интерполировать между результирующим цветом и нашим третьим значением:

col = lerp(col, face, mask.g);

Вы можете повторить это еще раз с красным каналом для четвертой текстуры.Конечно, это предполагает, что вы используете чистый красный, зеленый или синий в маске.Есть способы, чтобы использовать более конкретный цвет как ключ тоже, например, вы можете использовать абсолютное расстояния между цветом маски и некоторым опорного цветом:

fixed4 eyeMaskColor = (0.5, 0.5, 1, 1);
half t = 1 - saturate(abs(length(mask - eyeMaskColor)));

В этом случае t являютсяКоэффициент lerp, который вы используете, чтобы смешать текстуру.Функция saturate фиксирует значение в диапазоне [0, 1].Если цвет маски такой же, как у eyeMaskColor, то длина вектора между ними равна 0, а оператор равен 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...