DXGI 1.5新特性

    爲了支持更具彈性和的輸出設定和副本機制,DXGI1.5添加了下面這些功能:windows

  • 高動態範圍(HDR)和寬色域(WCG)
  • 可變刷新率顯示
  • 複製輸出
  • 奉獻和再生資源

高動態範圍(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

  • 在明亮和昏暗的地方表現更強的細節。下面這個圖標比較了ST.2084和是sRGB兩種標準所能表達的光強度區間,單位是nit。紫色是sRGB,低於0.1或高於100nit後,顏色就沒什麼區別了。ST.2084就在這兩個區間裏都有所表現。

  • 清晰區分漫反射區域和鏡面高光,例如金屬表面如今看起來更像金屬了。
  • 區分鏡面高光和不一樣顏色的光源
  • 區分反射和真光源

    一般高光區域是個極小時間內的小峯值,因此這一區間的幀的平均強度不會和標準動態區間有太大區別。用戶通常會給顯示器設一個比較舒服的平均標準動態區間流明(亮度)。若是應用有太多高亮度幀,用戶的眼睛會疲勞的很快。接口

    如今在電視界涵蓋性術語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

  • IDXGISwapChain4::SetHDRMetaData:設置HDR和WCG頭文件元數據。
  • DXGI_HDR_METADATA_HDR10:包含元數據設定的結構體
  • DXGI_HDR_METADATA_TYPE:頭文件元數據的枚舉型
  • DXGI_COLOR_SPACE_TYPE:定義色彩空間,顏色區間,伽馬,和其餘顏色格式。

可變刷新率顯示

    可變刷新率須要容許撕裂,也就是系統能夠關閉垂直同步

可變刷新率顯示系統/關閉垂直同步

    可變分辨率在建立和顯示swap chain的時候設定。

    要使用這個特性,應用用戶應在win10上安裝KB3156421或包含它的奶奶都升級包。任何一個D3D11和12的版本都支持這個特性。

    若是想在本身的程序中加入關閉垂直同步支持,能夠參考官方的例程D3D12Fullscreen (Working Samples)。但在此例程以外還有一些要注意的地方。

  • ResizeBuffers(或ResizeBuffer1)必須和Present(或Present1)使用相同的swap chain標識符(DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING)。
  • DXGI_PRESENT_ALLOW_TEARING只能夠用在同步間隔爲0的時候。建議在用CheckFeatureSupport肯定支持撕裂後,而且應用處於窗口模式(包括無邊框全屏模式)一直使用這個標識符。更多信息查看DXGI_PRESENT
  • 關閉垂直同步並不肯定會取消你的幀率上限:開發者得本身肯定有沒有其餘時間性時間對你的幀率有另外的限制(好比在XAML類應用裏的CompositionTarget:Rendering事件)

    下面的代碼給出了一些你在編寫程序可能用獲得的片斷

//--------------------------------------------------------------------------------------------------------
// 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標誌位意味着回收的資源要妥善處理。

相關文章
相關標籤/搜索