Udostępnij za pośrednictwem


Efekt tabeli odnośników 3D

Tabela odnośników 3-W jest efektem ogólnego przeznaczenia, który służy do hermetyzacji efektu 1:1 obrazu przez wstępne obliczenie, jak efekt mapuje dane wejściowe na dane wyjściowe dla podzestawu wszystkich wartości wejściowych.

Efekt tabela odnośników 3D (LUT) modyfikuje obraz wejściowy przy użyciu wartości koloru RGB obrazu w celu indeksowania tekstury 3D, gdzie tekstura zawiera wstępnie skompilowaną wartość wyjściową potoku efektu dowolnego.

Aby można było renderować zasób tekstury 3D LUT, należy załadować go do zasobu tekstury procesora GPU. Może to być kosztowne w zależności od rozmiaru tekstury i możliwości urządzenia. Deweloperzy aplikacji mogą określić, kiedy zapłacić ten koszt przy użyciu zasobu ID2D1LookupTable3D D2D. ID2D1LookupTable3D ma następujące atrybuty:

  • Zapewnia abstrakcyjną reprezentację zasobu procesora GPU 3D LUT.
  • W zależności od możliwości urządzenia zostanie utworzona tekstura 2D lub 3D wypełniona podanymi danymi LUT.
  • Można przekazać do właściwości efektu 3D LUT do renderowania.

Identyfikator CLSID dla tego efektu jest CLSID_D2D1LookupTable3D.

Przykładowy obraz

przykład danych wyjściowych efektów

Przykładowy kod

//
    // 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));

Właściwości efektu

Właściwości efektu tabeli odnośników 3D są definiowane przez wyliczenie D2D1_LOOKUPTABLE3D_PROP.

Wymagania

Wymaganie Wartość
Minimalny obsługiwany klient Windows 10 [aplikacje klasyczne | Aplikacje ze Sklepu Windows]
Minimalny obsługiwany serwer Windows 10 [aplikacje klasyczne | Aplikacje ze Sklepu Windows]
Nagłówek d2d1effects_2.h
Biblioteka d2d1.lib, dxguid.lib