Anonymous
HDR R10G10B10A2 в SDR R8G8B8A8
Сообщение
Anonymous » 03 ноя 2024, 13:33
Но когда я попытался использовать Dx11 для захвата экрана HDR, я получил формат R10G10B10A2, цветовой охват BT2020. Я пытался преобразовать цветовой охват с BT2020 в BT709, но отклонение цвета все равно было.
Например, серый цвет будет совсем не виден, а общая яркость слишком высока
< pre class="lang-cs Prettyprint-override">
Код: Выделить всё
float[,] matrix = {
{ 1.660491f, -0.587641f, -0.072850f },
{ -0.124550f, 1.132900f, -0.008349f },
{ -0.018151f, -0.100579f, 1.118730f },
}
float Linear(float value) {
return value > 0) & 0x3FF);
int g = (int)((value >> 10) & 0x3FF);
int b = (int)((value >> 20) & 0x3FF);
float linearR = Linear(r /1023f);
float linearG = Linear(g / 1023f);
float linearB = Linear(b / 1023f);
float bt2020R = matrix[0, 0] * linearR + matrix[0, 1] * linearG + matrix[0, 2] * linearB;
float bt2020G = matrix[1, 0] * linearR + matrix[1, 1] * linearG + matrix[1, 2] * linearB;
float bt2020B = matrix[2, 0] * linearR + matrix[2, 1] * linearG + matrix[2, 2] * linearB;
bt2020R =(float) Math.Clamp(bt2020R*254, 0, 255);
bt2020G =(float) Math.Clamp(bt2020G*254, 0, 255);
bt2020B =(float) Math.Clamp(bt2020B*254, 0, 255);
var d = outputDesc.MaxLuminance;
re[index*4]= (byte)Math.Round(bt2020R );
re[index*4+1]= (byte)Math.Round(bt2020G);
re[index*4+2] = (byte)Math.Round(bt2020B );
int a = (int)((value >> 30) & 0x3);
re[index*4+3] = (byte)(a);
https://github.com/MakesYT/Kitopia/blob ... eByDx11.cs
нормальный
но в моем коде
Подробнее здесь:
https://stackoverflow.com/questions/791 ... r-r8g8b8a8
1730629981
Anonymous
Но когда я попытался использовать Dx11 для захвата экрана HDR, я получил формат R10G10B10A2, цветовой охват BT2020. Я пытался преобразовать цветовой охват с BT2020 в BT709, но отклонение цвета все равно было. Например, серый цвет будет совсем не виден, а общая яркость слишком высока < pre class="lang-cs Prettyprint-override">[code]float[,] matrix = { { 1.660491f, -0.587641f, -0.072850f }, { -0.124550f, 1.132900f, -0.008349f }, { -0.018151f, -0.100579f, 1.118730f }, } float Linear(float value) { return value > 0) & 0x3FF); int g = (int)((value >> 10) & 0x3FF); int b = (int)((value >> 20) & 0x3FF); float linearR = Linear(r /1023f); float linearG = Linear(g / 1023f); float linearB = Linear(b / 1023f); float bt2020R = matrix[0, 0] * linearR + matrix[0, 1] * linearG + matrix[0, 2] * linearB; float bt2020G = matrix[1, 0] * linearR + matrix[1, 1] * linearG + matrix[1, 2] * linearB; float bt2020B = matrix[2, 0] * linearR + matrix[2, 1] * linearG + matrix[2, 2] * linearB; bt2020R =(float) Math.Clamp(bt2020R*254, 0, 255); bt2020G =(float) Math.Clamp(bt2020G*254, 0, 255); bt2020B =(float) Math.Clamp(bt2020B*254, 0, 255); var d = outputDesc.MaxLuminance; re[index*4]= (byte)Math.Round(bt2020R ); re[index*4+1]= (byte)Math.Round(bt2020G); re[index*4+2] = (byte)Math.Round(bt2020B ); int a = (int)((value >> 30) & 0x3); re[index*4+3] = (byte)(a); [/code] https://github.com/MakesYT/Kitopia/blob/Avalonia/Core.Window/ScreenCaptureByDx11.cs нормальный [img]https://i.sstatic.net/bm2fxVtU.png[/img] но в моем коде [img]https://i.sstatic.net/KnnHsWSG.png[/img] Подробнее здесь: [url]https://stackoverflow.com/questions/79152504/hdr-r10g10b10a2-to-sdr-r8g8b8a8[/url]