Effet de table de recherche 3D
Une table de recherche 3D est un effet à usage général utilisé pour encapsuler tout effet d’imagerie 1:1 en pré-calculant la façon dont l’effet mappe les entrées aux sorties pour un sous-ensemble de toutes les valeurs d’entrée.
L’effet LUT (3D Lookup Table) modifie une image d’entrée en utilisant la valeur de couleur RVB de l’image pour indexer une texture 3D, où la texture contient une valeur de sortie précalculée d’un pipeline d’effets arbitraire.
Le LUT 3D doit être chargé dans une ressource de texture GPU pour être rendu, ce qui peut être coûteux en fonction de la taille de la texture et des fonctionnalités de l’appareil. Les développeurs d’applications peuvent spécifier quand payer ce coût à l’aide de la ressource ID2D1LookupTable3D D2D. ID2D1LookupTable3D a les attributs suivants :
- Fournit une représentation abstraite de la ressource GPU de 3D LUT.
- Selon les fonctionnalités de l’appareil, une texture 2D ou 3D est créée et remplie avec les données LUT fournies.
- Peut être passé à la propriété de l’effet LUT 3D pour le rendu.
Le CLSID de cet effet est CLSID_D2D1LookupTable3D.
Exemple d’image
Exemple de code
//
// 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));
Propriétés de l’effet
Les propriétés de l’effet de table de recherche 3D sont définies par l’énumération D2D1_LOOKUPTABLE3D_PROP .
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 [applications de bureau | Applications du Windows Store] |
Serveur minimal pris en charge | Windows 10 [applications de bureau | Applications du Windows Store] |
En-tête | d2d1effects_2.h |
Bibliothèque | d2d1.lib, dxguid.lib |