DXGI 1.5新特性
为了支持更具弹性和的输出设定和副本机制,DXGI1.5添加了下面这些功能:
- 高动态范围(HDR)和宽色域(WCG)
- 可变刷新率显示
- 复制输出
- 奉献和再生资源
高动态范围(HDR)和宽色域(WCG)
HDR根据光的密度,从黑到白,显示的很不一样;款色与则提供了更大的色域。
简述
在DXGI 1.5里支持了HDR和WCG,都使用了至少10bits,而不是8bits:HDR10,一个10bit HDR/WCG格式。
现在显示器的最大亮度是为了支持漫反射平面,不比纸更亮,叫做纸白(paper white)。纸白定义了一个系统里亮白色的样子,例如在一个较暗的影院,一般用80nits,个人电脑显示器差不多220nits(一个nit就是每平方米每颗蜡烛的亮度,它是光的强度单位,我不想解释太多,网上或Real-time Rendering这本书里都能找到它的详细定义及使用场合)。这让显示器显示的图像尽量相似。HDR是比纸白这一层次还要高级的像素显示技术,可以让你更精确地显示,例如光源,反射光源,和相似的发光物体。它现在由色调映射来模拟,例如Reinhard。
就因为这个新添加的功能,标题内容生成器现在可以:
- 在明亮和昏暗的地方表现更强的细节。下面这个图标比较了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标志位意味着回收的资源要妥善处理。
DXGI 1.5新特性的更多相关文章
- SQL Server 2014 新特性——内存数据库
SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...
- ElasticSearch 5学习(10)——结构化查询(包括新特性)
之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...
- [干货来袭]C#6.0新特性
微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...
- CSS3新特性应用之结构与布局
一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...
- 【译】Meteor 新手教程:在排行榜上添加新特性
原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...
- 跨平台的 .NET 运行环境 Mono 3.2 新特性
Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...
- Atitit opencv版本新特性attilax总结
Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...
- es6 新特性2
es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...
- ES6 新特性
ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...
随机推荐
- 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析
目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...
- MailKit系列之---查询SearchQuery
对于邮件的唯一Id查询,由于MailKit提供了大量的方法,无法完全讲解完全,所以这里只选择几个来介绍. MailKit通过方法folder.Search来查询邮件的唯一Id,参数是一个SearchQ ...
- 自定义view(一)
最近在学习自定义view 一遍看一别学顺便记录一下 1.View的测量-------->onMeasure() 首先,当我们要画一个图形的时候,必须知道三个数据:位置,长度,宽度 才能确定 ...
- [转]安装 SciTE 报错 No package ‘gtk+-2.0′ found
centos 记事本,有时候感觉不够用,或者 出毛病,打不开文件 然后决定安装个其他的记事本, 找来找去, 感觉 SciTE 还可以,于是下载源码编译安装,结果 No package ‘gtk+-2 ...
- Math.abs()方法 取绝对值
定义和用法 abs() 方法可返回数的绝对值. 语法 Math.abs(x) 参数 描述 x 必需.必须是一个数值. 返回值 x 的绝对值. 实例 在本例中,我将取得正数和负数的绝对值: <sc ...
- PHP 面向对象编程和设计模式 (4/5) - 异常的定义、扩展及捕获
PHP高级程序设计 学习笔记 2014.06.12 异常经常被用来处理一些在程序正常执行中遇到的各种类型的错误.比如做数据库链接时,你就要处理数据库连接失败的情况.使用异常可以提高我们程序的容错特性, ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...
- CSS3中的动画效果记录
今天要记录的是CSS3中的三种属性transform.transition以及animation,这三个属性大大提升了css处理动画的能力. 一.Transform 变形 CSS中transform ...
- 在真机调试 iOS 应用:理解 Certificates, Identifiers & Profiles
No matching provisioning profiles found. No matching code signing identity found. Your account alrea ...
- (转)从P1到P7——我在淘宝这7年
(一) 2011-12-08 [原文链接] 今天有同事恭喜我,我才知道自己在淘宝已经七周年了.很多人第一句话就是七年痒不痒,老实说,也曾经痒过,但往往都是一痒而过,又投入到水深火热的工作中去.回家之后 ...