Effet de table de recherche 3D
Une table de recherche 3D est un effet à usage général utilisé pour encapsuler n’importe quel 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 3D Lookup Table (LUT) modifie une image d’entrée à l’aide de la valeur de couleur RVB de l’image pour indexer une texture 3D, où la texture contient une valeur de sortie précomputée d’un pipeline d’effet arbitraire.
LUT 3D doit être chargé dans une ressource de texture GPU afin d’être restituée, 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 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 transmis à la propriété de l’effet 3D LUT pour le rendu.
Le CLSID pour cet effet est CLSID_D2D1LookupTable3D.
- exemple d’image
- exemple de code
- propriétés d’effet
- Configuration requise
- rubriques connexes
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 d’effet
Les propriétés de l’effet de table de recherche 3D sont définies par l’énumération D2D1_LOOKUPTABLE3D_PROP.
Exigences
Exigence | Valeur |
---|---|
Client minimum pris en charge | Windows 10 [applications de bureau | Applications du Windows Store] |
Serveur minimum pris en charge | Windows 10 [applications de bureau | Applications du Windows Store] |
En-tête | d2d1effects_2.h |
Bibliothèque | d2d1.lib, dxguid.lib |