Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine 3D-Nachschlagetabelle ist ein allgemeiner Effekt, der verwendet wird, um einen 1:1-Bildverarbeitungseffekt zu kapseln, indem der Effekt Eingaben für eine Teilmenge aller Eingabewerte ordnet.
Der 3D-Nachschlagetabelleneffekt (LUT) ändert ein Eingabebild mithilfe des RGB-Farbwerts des Bilds, um eine 3D-Textur zu indizieren, wobei die Textur einen vorkompilierten Ausgabewert einer beliebigen Effektpipeline enthält.
Der 3D-LUT muss in eine GPU-Texturressource geladen werden, um gerendert zu werden, und dies kann je nach Größe der Textur und der Gerätefunktionen teuer sein. Anwendungsentwickler können angeben, wann diese Kosten mit der ID2D1LookupTable3D- D2D-Ressource bezahlt werden sollen. ID2D1LookupTable3D- weist die folgenden Attribute auf:
- Stellt eine abstrahierte Darstellung der GPU-Ressource von 3D LUT bereit.
- Abhängig von den Gerätefunktionen wird entweder eine 2D- oder 3D-Textur erstellt und mit den bereitgestellten LUT-Daten gefüllt.
- Kann zum Rendern an die Eigenschaft des 3D-LUT-Effekts übergeben werden.
Die CLSID für diesen Effekt ist CLSID_D2D1LookupTable3D.
Beispielbild
Beispielcode
//
// 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));
Effekteigenschaften
Die Eigenschaften für den 3D-Nachschlagetabelleneffekt werden durch die D2D1_LOOKUPTABLE3D_PROP Enumeration definiert.
Anforderungen
Anforderung | Wert |
---|---|
Mindestens unterstützter Client | Windows 10 [Desktop-Apps | Windows Store-Apps] |
Mindestens unterstützter Server | Windows 10 [Desktop-Apps | Windows Store-Apps] |
Kopfball | d2d1effects_2.h |
Bibliothek | d2d1.lib, dxguid.lib |