为了支持更具弹性和的输出设定和副本机制,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标志位意味着回收的资源要妥善处理。