Эффект таблицы трехмерного поиска
Трехмерная таблица поиска — это эффект общего назначения, который используется для инкапсуляции любого эффекта 1:1 путем предварительного вычисления того, как эффект сопоставляет входные данные с выходными данными для подмножества всех входных значений.
Эффект таблицы 3D-подстановки (LUT) изменяет входное изображение, используя значение цвета RGB изображения для индексирования трехмерной текстуры, где текстура содержит предварительно вычисляемое выходное значение конвейера произвольного эффекта.
Для отрисовки 3D-LUT необходимо загрузить в ресурс текстуры GPU, что может быть дорогостоящим в зависимости от размера текстуры и возможностей устройства. Разработчики приложений могут указать, когда следует оплатить эту стоимость с помощью ресурса ID2D1LookupTable3D D2D. ID2D1LookupTable3D имеет следующие атрибуты:
- Предоставляет абстрактное представление ресурса GPU 3D LUT.
- В зависимости от возможностей устройства будет создана двух- или трехмерная текстура, которая заполняется предоставленными данными LUT.
- Можно передать в свойство эффекта 3D LUT для отрисовки.
CLSID для этого эффекта CLSID_D2D1LookupTable3D.
Пример изображения
Образец кода
//
// 1. Generate the lookup table data and create an ID2D1LookupTable3D.
//
// Create a 16x16x16 LUT of arbitrary data type T.
UINT extents[] = { 16, 16, 16 };
UINT cElements = extents[0] * extents[1] * extents[2] * 4;
UINT cbElements = cElements * formatSize;
// Compute the step size in each direction to vary the RGB
// channels uniformly over the range [0, 1]
float steps[] =
{
1.0f / static_cast<float>(extents[0] - 1),
1.0f / static_cast<float>(extents[1] - 1),
1.0f / static_cast<float>(extents[2] - 1),
};
CArray<BYTE> lutData;
IFR(lutData.Resize(cbElements));
T* pData = reinterpret_cast<T *>(lutData.GetData());
T oneValue = ConvertValue<T>(1.0f);
// Generate the LUT by applying an imaging pipeline to RGB values.
for (UINT iR = 0; iR < extents[2]; iR++)
{
for (UINT iG = 0; iG < extents[1]; iG++)
{
for (UINT iB = 0; iB < extents[0]; iB++)
{
T outputColor[3];
ApplyPipeline(iR * steps[2], iG * steps[1], iB * steps[0], &outputColor);
pData[0] = outColor[0];
pData[1] = outColor[1];
pData[2] = outColor[2];
// Set opaque alpha in the output
pData[3] = oneValue;
// Advance the pointer
pData += sizeof(T) * 4;
}
}
}
// Compute the strides of the LUT data.
UINT strides[2];
IFR(UIntMult(sizeof(T) * 4, extents[0], &strides[0]));
IFR(UIntMult(strides[0], extents[1], &strides[1]));
D2D1_BUFFER_PRECISION precision = GetBufferPrecision<T>();
// Create an ID2D1LookupTable3D from the LUT data.
CComPtr<ID2D1LookupTable3D> sp3dLut;
IFR(_spEffectContext1->CreateLookupTable3D(
precision,
extents,
lutData.GetData(),
lutData.GetCount(),
strides,
&sp3dLut
));
//
// 2. To apply the lookup table to an input image, create a LookupTable3D effect
// and pass the ID2D1LookupTable3D to the effect as a property.
//
// Create a 3D LUT effect to render our LUT.
CComPtr<ID2D1Effect> sp3dLutEffect;
IFR(pEffectContext->CreateEffect(CLSID_D2D1LookupTable3D, &sp3dLutEffect));
// Set the LUT as a property on the effect.
IFR(sp3dLutEffect->SetValue(D2D1_LOOKUPTABLE3D_PROP_LUT, _spLut));
Свойства эффекта
Свойства для эффекта таблицы трехмерного подстановки определяются перечислением D2D1_LOOKUPTABLE3D_PROP .
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 10 [классические приложения | Приложения Магазина Windows] |
Минимальная версия сервера | Windows 10 [классические приложения | Приложения Магазина Windows] |
Заголовок | d2d1effects_2.h |
Библиотека | d2d1.lib, dxguid.lib |