Войти
ПрограммированиеФорумГрафика

Помогите реализовать блендеровский HueSaturationValue в шейдере

#0
(Правка: 21:25) 21:21, 13 фев. 2020

Привет всем!
В блендере есть HueSaturationValue.
Ссылка на HSV: https://docs.blender.org/manual/en/latest/compositing/types/color… turation.html
Выглядит он так:
--- | Помогите реализовать блендеровский HueSaturationValue в шейдере

В сети нашел некоторый код преобразования цвета в HSV (https://www.geeksforgeeks.org/program-change-rgb-color-model-hsv-color-model/)
_HSV содержит h,v,s компоненты.

+ Показать

Что-то в этом коде неправильно, потому, что результаты рендера текстуры в Unity и Blender очень сильно различаются.
Подсткажите где ошибка


#1
22:11, 13 фев. 2020

Alerr
Покажешь как отличаются?

#2
22:16, 13 фев. 2020

А еще блендеровский Hue Saturation Value Node делает не одно преобразование, а два. Сначала переводит RGB -> HSV, потом умножает на коэффициенты получившийся цвет, потом переводит обратно HSV -> RGB если что.

#3
22:16, 13 фев. 2020

Не уверена на все сто, но в Blender по-моему параметры оттенков не линейные.

#4
23:25, 13 фев. 2020

MrShoor
> Покажешь как отличаются?
Сильно отличались (синий становился желтым), код был неверный совсем.

>А еще блендеровский Hue Saturation Value Node делает не одно преобразование, а два. Сначала переводит RGB -> HSV, потом умножает на коэффициенты получившийся цвет, потом переводит обратно HSV -> RGB если что.
Спасибо :)

Вот здесь вроде рабочее преобразование (кому нужно): https://github.com/greggman/hsva-unity/blob/master/Assets/Shaders… Shader.shader

#5
23:25, 13 фев. 2020

блендеровцы

#6
8:08, 14 фев. 2020

Misanthrope
Хто не скаче тий Юнитист.

#7
(Правка: 16:28) 16:25, 14 фев. 2020
  _HUEValue ("HUE value", Range(0,360)) = 0
  _SaturationValue("Saturation Value", Range(0, 2)) = 1
  _BrightestValue("Brightest Value", Range(0, 2)) = 1
            inline float3 applyHue(float3 aColor, float aHue)
            {
                float angle = radians(aHue);
                float3 k = float3(0.57735, 0.57735, 0.57735);
                float cosAngle = cos(angle);
            
                return aColor * cosAngle + cross(k, aColor) * sin(angle) + k * dot(k, aColor) * (1 - cosAngle);
            }
                result.rgb = applyHue(result.rgb, _HUEValue);

                result.rgb *= _BrightestValue;

                float grayscale = dot(result.rgb, float3(0.3, 0.59, 0.11));
                result.rgb = lerp(grayscale, result.rgb, _SaturationValue);

разве что HUE можно привести в диапазон 0-1

ПрограммированиеФорумГрафика