Partager via


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 sortie d’effet

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