HDR R10G10B10A2 в SDR R8G8B8A8C#

Место общения программистов C#
Ответить
Anonymous
 HDR R10G10B10A2 в SDR R8G8B8A8

Сообщение Anonymous »

Но когда я попытался использовать 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»