爲了支持更具彈性和的輸出設定和副本機制,DXGI1.5添加了下面這些功能:windows
高動態範圍(HDR)和寬色域(WCG)less
HDR根據光的密度,從黑到白,顯示的很不同;款色與則提供了更大的色域。ui
簡述spa
在DXGI 1.5裏支持了HDR和WCG,都使用了至少10bits,而不是8bits:HDR10,一個10bit HDR/WCG格式。debug
如今顯示器的最大亮度是爲了支持漫反射平面,不比紙更亮,叫作紙白(paper white)。紙白定義了一個系統裏亮白色的樣子,例如在一個較暗的影院,通常用80nits,我的電腦顯示器差很少220nits(一個nit就是每平方米每顆蠟燭的亮度,它是光的強度單位,我不想解釋太多,網上或Real-time Rendering這本書裏都能找到它的詳細定義及使用場合)。這讓顯示器顯示的圖像儘可能類似。HDR是比紙白這一層次還要高級的像素顯示技術,可讓你更精確地顯示,例如光源,反射光源,和類似的發光物體。它如今由色調映射來模擬,例如Reinhard。code
就由於這個新添加的功能,標題內容生成器如今能夠:blog
一般高光區域是個極小時間內的小峯值,因此這一區間的幀的平均強度不會和標準動態區間有太大區別。用戶通常會給顯示器設一個比較舒服的平均標準動態區間流明(亮度)。若是應用有太多高亮度幀,用戶的眼睛會疲勞的很快。接口
如今在電視界涵蓋性術語Ultra-High Definition(UHD)幾乎就是HDR、WCG、高幀率,高分辨率的同義詞。但它不意味着4K。學術上來講,HDR只指代亮白與深黑的區別,但有時也被用於涵蓋WCG的場景。遊戲
當前大多數開發內容都假設紙白(paper white,技術術語)至關於80到100nits。當前大多數顯示器的峯值光強度就是250到300nits。這比金屬反射光的強度小多了,那個大概得10000nits。玻璃反光還得300000nits呢。相對於太陽光自己的1600000nits更微不足道了。事件
在光譜的另外一端,月光,也就1nit;星光,大概就0.000001nit。
使用HDR顯示將會增長光強的峯值,通常對於LCD電視來講就是1000nit,對於OLED電視最多800nit。
紅綠藍三色和顯示器實際渲染顏色的關係由8位變種標準BT.709(應用於當前電視,與8位sRGB很是相似)這類色彩標準肯定。下面這張圖就展現了10位標準BT.2020(也支持12位變種)對顏色的擴展支持。最明顯的增加是綠色,也包括一部分深紅、黃和紫。
左爲BT.709右爲BT.2020
這兩張圖是xy色度圖,它在顏色空間裏標註出了色域,忽略了流明。整個馬蹄形區域包括了普通人所能看到的全部顏色。馬蹄形區域外面的藍色數字是光譜軌跡,從380nm到700nm,是單色光的波長。馬蹄形底端從紫到紅的直線是非純色,不能由單色表達的光。馬蹄形外的顏色人類看不到。
D65定義爲「白點」。白點被用於大多數消費級電子色彩空間裏,包括sRGB。這個三角區域就是三通道顯示器,好比LCD能顯示的全部顏色。xyY色彩空間裏,你能夠經過組合兩個顏色點來得到他們的組合色,方法是在兩點間連線,你要的顏色點就在這條直線上。
當顯示器支持更大色域的時候應該好好利用,好比說用每通道10位。16位可能在某些狀況下更好。遊戲用到HDR的時候最少要上10位,爲了和最終的swapchain格式匹配也能夠考慮用16位的。
HDR和WCG的API
爲了開啓HDR和WCG功能,要用到下面這些API
可變刷新率顯示
可變刷新率須要容許撕裂,也就是系統能夠關閉垂直同步
可變刷新率顯示系統/關閉垂直同步
可變分辨率在建立和顯示swap chain的時候設定。
要使用這個特性,應用用戶應在win10上安裝KB3156421或包含它的奶奶都升級包。任何一個D3D11和12的版本都支持這個特性。
若是想在本身的程序中加入關閉垂直同步支持,能夠參考官方的例程D3D12Fullscreen (Working Samples)。但在此例程以外還有一些要注意的地方。
下面的代碼給出了一些你在編寫程序可能用獲得的片斷
//-------------------------------------------------------------------------------------------------------- // Define new symbols //-------------------------------------------------------------------------------------------------------- // The required symbols are in dxgi1_5.h. Developers can define those symbols if they are missing in their SDK. #ifdef DXGI_PRESENT_ALLOW_TEARING #include <dxgi1_5.h> #else #define DXGI_PRESENT_ALLOW_TEARING 0x00000200UL #define DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING 2048 typedef enum DXGI_FEATURE { DXGI_FEATURE_PRESENT_ALLOW_TEARING = 0 } DXGI_FEATURE; MIDL_INTERFACE("7632e1f5-ee65-4dca-87fd-84cd75f8838d") IDXGIFactory5 : public IDXGIFactory4 { public: virtual HRESULT STDMETHODCALLTYPE CheckFeatureSupport( DXGI_FEATURE Feature, _Inout_updates_bytes_(FeatureSupportDataSize) void *pFeatureSupportData, UINT FeatureSupportDataSize) = 0; }; #endif //-------------------------------------------------------------------------------------------------------- // Check Tearing Support //-------------------------------------------------------------------------------------------------------- // Determines whether tearing support is available for fullscreen borderless windows. void DXSample::CheckTearingSupport() { // Rather than create the 1.5 factory interface directly, we create the 1.4 // interface and query for the 1.5 interface. This will enable the graphics // debugging tools which might not support the 1.5 factory interface. ComPtr<IDXGIFactory4> factory4; HRESULT hr = CreateDXGIFactory1(IID_PPV_ARGS(&factory4)); BOOL allowTearing = FALSE; if (SUCCEEDED(hr)) { ComPtr<IDXGIFactory5> factory5; hr = factory4.As(&factory5); if (SUCCEEDED(hr)) { hr = factory5->CheckFeatureSupport(DXGI_FEATURE_PRESENT_ALLOW_TEARING, &allowTearing, sizeof(allowTearing)); } } m_tearingSupport = SUCCEEDED(hr) && allowTearing; } //-------------------------------------------------------------------------------------------------------- // Set up swapchain properly //-------------------------------------------------------------------------------------------------------- // It is recommended to always use the tearing flag when it is supported. swapChainDesc.Flags = m_tearingSupport ? DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING : 0; //-------------------------------------------------------------------------------------------------------- // Present //-------------------------------------------------------------------------------------------------------- UINT presentFlags = (m_tearingSupport && m_windowedMode) ? DXGI_PRESENT_ALLOW_TEARING : 0; // Present the frame. ThrowIfFailed(m_swapChain->Present(0, presentFlags));
複製輸出
DXGI1.5給原生的DuplicateOutput方法添加了IDXGIoutput5接口和DuplicateOutput1方法。DuplicateOutput1容許設定IDXGIOutputDuplication返回的全屏surface格式。
奉獻和再生資源
OfferResources1和ReclaimResources1這兩個方法作了升級,能夠添加到新接口IDXGIDevice4,做爲釋放資源類接口,他能夠接觸內存。新的 DXGI_OFFER_RESOURCE_FLAG_ALLOW_DECOMMIT標誌位意味着回收的資源要妥善處理。