//-------------------------------------------------------------------------------------- // File: PostProcess.h // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A // PARTICULAR PURPOSE. // // Copyright (c) Microsoft Corporation. All rights reserved. // // http://go.microsoft.com/fwlink/?LinkId=248929 //-------------------------------------------------------------------------------------- #pragma once #if defined(WINAPI_FAMILY) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP #error Post-processing not supported for Windows Phone 8.x; requires Direct3D hardware Feature Level 10.0 or better #endif #if defined(_XBOX_ONE) && defined(_TITLE) #include #else #include #endif #include #include #include namespace DirectX { //---------------------------------------------------------------------------------- // Abstract interface representing a post-process pass class IPostProcess { public: virtual ~IPostProcess() { } virtual void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) = 0; }; //---------------------------------------------------------------------------------- // Basic post-process class BasicPostProcess : public IPostProcess { public: enum Effect { Copy, Monochrome, Sepia, DownScale_2x2, DownScale_4x4, GaussianBlur_5x5, BloomExtract, BloomBlur, Effect_Max }; explicit BasicPostProcess(_In_ ID3D11Device* device); BasicPostProcess(BasicPostProcess&& moveFrom); BasicPostProcess& operator= (BasicPostProcess&& moveFrom); BasicPostProcess(BasicPostProcess const&) = delete; BasicPostProcess& operator= (BasicPostProcess const&) = delete; virtual ~BasicPostProcess(); // IPostProcess methods. void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) override; // Shader control void __cdecl SetEffect(Effect fx); // Properties void __cdecl SetSourceTexture(_In_opt_ ID3D11ShaderResourceView* value); // Sets multiplier for GaussianBlur_5x5 void __cdecl SetGaussianParameter(float multiplier); // Sets parameters for BloomExtract void __cdecl SetBloomExtractParameter(float threshold); // Sets parameters for BloomBlur void __cdecl SetBloomBlurParameters(bool horizontal, float size, float brightness); private: // Private implementation. class Impl; std::unique_ptr pImpl; }; //---------------------------------------------------------------------------------- // Dual-texure post-process class DualPostProcess : public IPostProcess { public: enum Effect { Merge, BloomCombine, Effect_Max }; explicit DualPostProcess(_In_ ID3D11Device* device); DualPostProcess(DualPostProcess&& moveFrom); DualPostProcess& operator= (DualPostProcess&& moveFrom); DualPostProcess(DualPostProcess const&) = delete; DualPostProcess& operator= (DualPostProcess const&) = delete; virtual ~DualPostProcess(); // IPostProcess methods. void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) override; // Shader control void __cdecl SetEffect(Effect fx); // Properties void __cdecl SetSourceTexture(_In_opt_ ID3D11ShaderResourceView* value); void __cdecl SetSourceTexture2(_In_opt_ ID3D11ShaderResourceView* value); // Sets parameters for Merge void __cdecl SetMergeParameters(float weight1, float weight2); // Sets parameters for BloomCombine void __cdecl SetBloomCombineParameters(float bloom, float base, float bloomSaturation, float baseSaturation); private: // Private implementation. class Impl; std::unique_ptr pImpl; }; //---------------------------------------------------------------------------------- // Tone-map post-process class ToneMapPostProcess : public IPostProcess { public: enum Operator // Tone-mapping operator { None, // Pass-through Saturate, // Clamp [0,1] Reinhard, // x/(1+x) ACESFilmic, Operator_Max }; enum TransferFunction // Electro-Optical Transfer Function (EOTF) { Linear, // Pass-through SRGB, // sRGB (Rec.709 and approximate sRGB display curve) ST2084, // HDR10 (Rec.2020 color primaries and ST.2084 display curve) TransferFunction_Max }; explicit ToneMapPostProcess(_In_ ID3D11Device* device); ToneMapPostProcess(ToneMapPostProcess&& moveFrom); ToneMapPostProcess& operator= (ToneMapPostProcess&& moveFrom); ToneMapPostProcess(ToneMapPostProcess const&) = delete; ToneMapPostProcess& operator= (ToneMapPostProcess const&) = delete; virtual ~ToneMapPostProcess(); // IPostProcess methods. void __cdecl Process(_In_ ID3D11DeviceContext* deviceContext, _In_opt_ std::function setCustomState = nullptr) override; // Shader control void __cdecl SetOperator(Operator op); void __cdecl SetTransferFunction(TransferFunction func); #if defined(_XBOX_ONE) && defined(_TITLE) // Uses Multiple Render Targets to generate both HDR10 and GameDVR SDR signals void __cdecl SetMRTOutput(bool value = true); #endif // Properties void __cdecl SetHDRSourceTexture(_In_opt_ ID3D11ShaderResourceView* value); // Sets exposure value for LDR tonemap operators void SetExposure(float exposureValue); // Sets ST.2084 parameter for how bright white should be in nits void SetST2084Parameter(float paperWhiteNits); private: // Private implementation. class Impl; std::unique_ptr pImpl; }; }