Войти
ФлеймФорумПрограммирование

Аппроксимация гаммы (2 стр)

Страницы: 1 2
#15
14:28, 11 июня 2017

}:+()___ [Smile]
>коэффициенты кривые
Допёр.

#16
20:38, 11 июня 2017
sqrtf(0.0001f+x*(1.207f-x*0.187f))-0.01f;

Результат -

                  c5|    2.7| 0.00505| 0.00662|  0.0144
#17
22:21, 11 июня 2017

Тему не читал полностью. Использовал FindFit из математики (не идеал):

c5 = 0.0113588+sqrtf(1.87577e-32+1.13779*x-0.168449*x*x)
d7 = 0.00217977+x*(-0.000521136+x*(0.701654+0.297794*x))
c5|    4.2| 0.0023| 0.0037|  0.033
d7|    3.0|0.00041|0.00048| 0.0022
#18
23:36, 11 июня 2017

Zegalur
> Использовал FindFit из математики (не идеал):
Фуфло это, причем полное. Не проходит ни через 0, ни через 1, преобразования не являются обратными друг другу.
Вот поэтому я считаю, что всякие автоматические подгонялки — это фуфло. На практике оказывается, что сохранение инвариантов на много важнее абстрактной точности.

#19
2:37, 12 июня 2017

}:+()___ [Smile]
Ну есть же специальные хаки.
Можно брать f(x)/x, а потом на x руками домножать. И т. д.
Ну т. е. смесь автоматики и руками. И то и другое в чистом виде сомнительно.

А что ты вообще понимаешь под "обратными друг другу"? С учётом вычисления во float?

#20
8:44, 12 июня 2017

}:+()___ [Smile]
> Не проходит ни через 0, ни через 1, преобразования не являются обратными друг другу
не вопрос, все это можно добавить как условия.
пока вот такое подобрало:

c6 = sqrtf(x*(1.18162f - 0.18162f*x))
d8 = 0.0125218f*x + 0.682174f*x*x + 0.305304f*x*x*x
c6|    2.6| 0.0039| 0.0046|  0.023
d8|    2.6|0.00077|0.00088| 0.0017

может вечером попробую сделать обратные.
Пока что Max|d8(c6)-x|<0.008, Max|c6(d8)-x|<0.0052

#21
22:39, 12 июня 2017

FordPerfect
> А что ты вообще понимаешь под "обратными друг другу"? С учётом вычисления во float?
То, что погрешность преобразования туда-обратно сильно меньше погрешностей каждого отдельного преобразования.
Как минимум, надо проверить, что оно не запарывает значения дефолтного диапазона [0..255].

В общем, я тут прикинул, при сохранении условия обратимости формулу можно расширить до \(\sqrt{ax^2+bx+c}-dx-e\).
Подогнанные коэффициенты выглядят примерно так: a = 1.530326, d = 0.906151, e = 0.058577, b = (d + 1)(d + 2e + 1) − a и c = e^2.

float c5(float x)
{
    return sqrtf(0.0034312649f + x * (2.3263988f + x * 1.530326f)) - 0.906151f * x - 0.058577f;
}

float d7(float x)
{
    return sqrtf(2.450091f + x * (-3.8346549f + x * 3.0424711f)) + 1.2776792f * x - 1.5652767f;
}

Непонятно только, откуда такая разница скорости прямого и обратного преобразования, если формула по сути одна и та же:

c5|    3.1| 0.0025| 0.0028| 0.0039
d7|    4.8| 0.0025| 0.0033| 0.0072
Прошло более 4 лет
#22
17:27, 16 окт 2021

По случаю https://gamedev.ru/flame/forum/?id=218515&page=5&m=5454701#m61 выкладываю тамошние аппроксимации.
https://rextester.com/MISK61790

Я там использовал рациональные функции, а не корни.
Также осознал довольно очевидную вещь - точность srgb2linear влияет обычно сильнее: если linear2srgb(blend(srgb2linear(x))), то ошибка srgb2linear потенциально умножается на 12.92. Ну srgb2linear и аппроксимировать легче.

c_p4q4(d_p4q2(x)) - round-trip, для кратных 1/255, как и c5(d7(x)).

#23
22:15, 16 окт 2021

Добавил http://chilliant.blogspot.com/2012/08/srgb-approximations-for-hlsl.html ещё (c_b*, d_b):
https://rextester.com/BEPIW32130

Страницы: 1 2
ФлеймФорумПрограммирование

Тема в архиве.