Кажется, я не могу правильно передать цвета в кодировщик. Я пытаюсь визуализировать видео, которое имеет 3 изображения: одно зеленое со значением 1,0, одно со значением 2,0 и одно со значением 3,0 (максимум) в RGB, то есть в D2D1_COLOR_F это {0,1, 0,1}, {0,2,0,1} и {0,3,0,1}.
Правильно отображается только максимум 3 (левый — сгенерированный видео, правый цвет — правильный цвет, который должен отображаться в видео):
[img]https://i.stack. imgur.com/qdsoV.png[/img]
Если для зеленого установлено значение 2.0, вот результат:

А если для зеленого установлено значение 1,0, то еще хуже:

И это является результатом настоящего HDR-изображения:

Кодер Nvidia принимает цвета в формате AR30, то есть 10 бит для R,G,B и 2 для Alpha (который игнорируется). Мой отрендеренный DirectX имеет цвета в GUID_WICPixelFormat128bppPRGBAFloat, поэтому я делаю это:
Код: Выделить всё
struct fourx
{
float r, g, b, a;
};
float*f = pointer_to_floats;
for (int x = 0; x < wi; x++)
{
for (int y = 0; y < he; y++)
{
char* dx = (char*)f;
dx += y * wi * 16;
dx += x * 16;
fourx* col = (fourx*)dx;
DirectX::XMVECTOR v;
DirectX::XMVECTORF32 floatingVector = { col->r,col->g,col->b,col->a };
v = floatingVector;
// float is 0 to max_lim
float max_number = 3.0f; // this is got from my monitor's white level as described [here][6].
DirectX::PackedVector::XMUDECN4 u4 = {};
col->r *= 1023.0f / max_number;
col->g *= 1023.0f / max_number;
col->b *= 1023.0f / max_number;
u4.z = (int)col->r;
u4.y = (int)col->g;
u4.x = (int)col->b;
u4.w = 0;
DWORD* dy = output_pointer;
dy += y * wi;
dy += x;
*dy = u4.operator unsigned int();
}
}
Я не знаю, как действовать дальше.
Подробнее здесь: https://stackoverflow.com/questions/781 ... dr-encoder