Как Gradient.Evaluate работает внутри компании? - PullRequest
1 голос
/ 28 февраля 2020

Я пытался сделать структуру, похожую на встроенную в Unity Gradient.

Что я застрял при попытке обдумать, это функция Gradient.Evaluate, как она работает внутри?

Любые фрагменты кода будут действительно полезны!

Примечание: я не использую Unity, поэтому задаю этот вопрос.

1 Ответ

1 голос
/ 28 февраля 2020

Цвет состоит из 4 компонентов: RGBA. Красный - Зеленый - Синий - Альфа

Эти компоненты хранятся в виде целых чисел от 0 до 255.

Белый - это: (1,1,1,1)

Черный - это : (0,0,0,1)

Если значение A не равно 1, цвет будет прозрачным.

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

colorA = (0,0,1,1) //This is blue
colorB = (1,0,0,1) //This is red

Давайте упростим вычисление градиента с помощью некоторого псевдокода:

gradient.ColorKey[0].color = colorA;
gradient.ColorKey[0].time = 0f;
gradient.ColorKey[1].color = colorB;
gradient.ColorKey[1].time = 2f;

gradient.Evaluate(0f); 
// (0,0,1,1)
gradient.Evaluate(0.6f); // 0.6 seconds in, or 70% key0 and 30% key1
// 0.7 * (0,0,1,1) + 0.3 * (1,0,0,1) = 
//(0.3, 0, 0.7, 1)
gradient.Evaluate(1.8f); // 1.8 seconds in, or 10% key0 and 90% key1
// 0.1 * (0,0,1,1) + 0.9 * (1,0,0,1) = 
//(0.9, 0, 0.1, 1)
gradient.Evaluate(2f); 
// (1,0,0,1)

Если у вашего градиента было более 2 ключей, при расчете градиента используются только 2 клавиши, соседние с временем оценки. Например:

A (0,0,1,1) at 0s
B (1,0,0,1) at 1s
C (0,1,0,1) at 2s

gradient.Evaluate(0.7f); //results in 30% of A + 70% of B (0.7, 0, 0.3, 1)
gradient.Evaluate(1.5f); //results in 50% of B + 50% of C (0.5, 0.5, 0, 1)
...