maxscript для автоматизации преобразования цвета rgb в гамму 2.2?

в основном, у меня есть много старых 3D-моделей с материалами, созданными в среде с гаммой 1.0, и каждый раз, когда я хочу использовать одну из них, мне приходится вручную преобразовывать все цвета, чтобы они соответствовали эквиваленту гаммы 2.2.

я использую формулу 255*((old/255)^2.2), основанную на руководстве mintviz, но ручная коррекция всех цветов является утомительным и трудоемким процессом, и, по крайней мере, теоретически может быть сильно автоматизирована.

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

Я сделал небольшое взаимодействие пользовательских атрибутов в maxscript, но это все, поэтому у меня нет большого опыта в этом, поэтому мне нужна помощь.

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

что вы думаете?

это должно быть достаточно просто, я просто даже не знаю с чего начать


person Rafael Adamy    schedule 18.03.2016    source источник
comment
вот что у меня получилось: function RGBtoLinear = ( oldr = $.material.diffuseColor.r oldg = $.material.diffuseColor.g oldb = $.material.diffuseColor.b $.material.diffuseColor.r = 255 * ((oldr/255)^2.2) $.material.diffuseColor.g = 255 * ((oldg/255)^2.2) $.material.diffuseColor.b = 255 * ((oldb/255)^2.2)) для obj в выделении do ( RGBtoLinear() ) работает, но только для диффузного слота. Я хочу, чтобы он работал для каждого слота с цветами, то есть: (в случае vraymat слот Reflect) имеет карту спада с 2 цветами, я хочу, чтобы он также конвертировал их.   -  person Rafael Adamy    schedule 18.03.2016
comment
не могу правильно добавить коды по какой-то причине   -  person Rafael Adamy    schedule 18.03.2016


Ответы (1)


Вы можете попробовать получить все классы материалов и карт текстур, от которых зависит выбранный объект, и изменить все их свойства, содержащие значение цвета:

fn gammaCorrectClr clrP4 gamma =
    (255 * [clrP4.x^gamma, clrP4.y^gamma, clrP4.z^gamma]) as Color

mapped fn gammaCorrectMaterial mat gamma =
(
    local props = getPropNames mat

    for prop in props where isKindOf (local val = getProperty mat prop) Color do
        setProperty mat prop (gammaCorrectClr (val as Point4) gamma)
)

for matClass in Material.classes do gammaCorrectMaterial (getClassInstances matClass target:selection[1]) 2.2
for texClass in TextureMap.classes do gammaCorrectMaterial (getClassInstances texClass target:selection[1]) 2.2

Если вы хотите сделать то же самое только для всей сцены, а не для выбранного объекта, удалите часть target:selection[1] из обоих вызовов getClassInstances.

person Swordslayer    schedule 12.05.2016