首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DXGI_MODE_SCALING_UNSPECIFIED缩放模式在从IDXGIOutput.GetDisplayModeList返回的模式列表中意味着什么?

DXGI_MODE_SCALING_UNSPECIFIED缩放模式在从IDXGIOutput.GetDisplayModeList返回的模式列表中意味着什么?
EN

Stack Overflow用户
提问于 2015-03-17 07:45:30
回答 1查看 929关注 0票数 1

我正在尝试创建支持全屏模式的Direct3D 10/11应用程序。为了做到这一点,我必须向用户提供可用视频模式的列表。另外,最好选择当前的桌面设置作为默认视频模式,以尽量减少视频模式的更改。

在Direct3D 9中这样做非常简单。例如,下面是由Direct3D 9提供的模式列表:

代码语言:javascript
复制
Current mode: 1920x1080x60Hz 32bit X8R8G8B8
Available modes:
Front buffer format 32bit X8R8G8B8: 35
1: 1920x1080x60Hz
2: 640x480x60Hz
3: 640x480x72Hz
4: 640x480x75Hz
5: 720x480x56Hz
6: 720x480x60Hz
7: 720x480x72Hz
8: 720x480x75Hz
9: 720x576x56Hz
10: 720x576x60Hz
11: 720x576x72Hz
12: 720x576x75Hz
13: 800x600x56Hz
14: 800x600x60Hz
15: 800x600x72Hz
16: 800x600x75Hz
17: 1024x768x60Hz
18: 1024x768x70Hz
19: 1024x768x75Hz
20: 1152x864x75Hz
21: 1280x720x60Hz
22: 1280x768x60Hz
23: 1280x800x60Hz
24: 1280x960x60Hz
25: 1280x1024x60Hz
26: 1280x1024x75Hz
27: 1360x768x60Hz
28: 1366x768x60Hz
29: 1600x900x59Hz
30: 1600x900x60Hz
31: 1600x1024x59Hz
32: 1600x1024x60Hz
33: 1680x1050x59Hz
34: 1680x1050x60Hz
35: 1440x900x60Hz

但是通过DXGI做同样简单的事情有点复杂。最让我困惑的是,IDXGIOutpit.GetDisplayModeList方法返回多达3份相同视频模式的副本。不同之处在于缩放模式,但条件是:

代码语言:javascript
复制
DXGI_MODE_SCALING_UNSPECIFIED = 0
DXGI_MODE_SCALING_CENTERED = 1
DXGI_MODE_SCALING_STRETCHED = 2

下面是:

代码语言:javascript
复制
List of modes for format 32bit R8G8B8A8 UNorm:
640x480x60Hz Progressive Unspecified 
640x480x72Hz Progressive Unspecified 
640x480x75Hz Progressive Unspecified 
720x480x56Hz Progressive Unspecified 
720x480x56Hz Progressive Centered 
720x480x56Hz Progressive Stretched 
720x480x60Hz Progressive Unspecified 
720x480x60Hz Progressive Centered 
720x480x60Hz Progressive Stretched 
720x480x72Hz Progressive Unspecified 
720x480x72Hz Progressive Centered 
720x480x72Hz Progressive Stretched 
720x480x75Hz Progressive Unspecified 
720x480x75Hz Progressive Centered 
720x480x75Hz Progressive Stretched 
720x576x56Hz Progressive Unspecified 
720x576x56Hz Progressive Centered 
720x576x56Hz Progressive Stretched 
720x576x60Hz Progressive Unspecified 
720x576x60Hz Progressive Centered 
720x576x60Hz Progressive Stretched 
720x576x72Hz Progressive Unspecified 
720x576x72Hz Progressive Centered 
720x576x72Hz Progressive Stretched 
720x576x75Hz Progressive Unspecified 
720x576x75Hz Progressive Centered 
720x576x75Hz Progressive Stretched 
800x600x56Hz Progressive Unspecified 
800x600x60Hz Progressive Unspecified 
800x600x72Hz Progressive Unspecified 
800x600x75Hz Progressive Unspecified 
1024x768x60Hz Progressive Unspecified 
1024x768x70Hz Progressive Unspecified 
1024x768x75Hz Progressive Unspecified 
1152x864x75Hz Progressive Unspecified 
1280x720x60Hz Progressive Unspecified 
1280x768x59Hz Progressive Unspecified 
1280x768x59Hz Progressive Centered 
1280x768x59Hz Progressive Stretched 
1280x800x59Hz Progressive Unspecified 
1280x960x60Hz Progressive Unspecified 
1280x1024x60Hz Progressive Unspecified 
1280x1024x75Hz Progressive Unspecified 
1360x768x59Hz Progressive Unspecified 
1360x768x59Hz Progressive Centered 
1360x768x59Hz Progressive Stretched 
1366x768x59Hz Progressive Unspecified 
1366x768x59Hz Progressive Centered 
1366x768x59Hz Progressive Stretched 
1440x900x59Hz Progressive Unspecified 
1600x900x59Hz Progressive Unspecified 
1600x900x59Hz Progressive Centered 
1600x900x59Hz Progressive Stretched 
1600x1024x59Hz Progressive Unspecified 
1600x1024x59Hz Progressive Centered 
1600x1024x59Hz Progressive Stretched 
1680x1050x59Hz Progressive Unspecified 
1920x1080x60Hz Progressive Unspecified 

首先,我认为DXGI_MODE_SCALING_STRETCHED =此模式需要拉伸(后缓冲区较小,前缓冲较小,分辨率可能不是物理的),DXGI_MODE_SCALING_CENTERED =在此模式下图像可能不占据整个屏幕(后缓冲区较小,然后是前缓冲区,但物理分辨率被保留),DXGI_MODE_SCALING_UNSPECIFIED =“正常模式”(前后缓冲区匹配的大小,但物理分辨率不能保证)。也就是说,我应该只显示那些模式,即Scaling = DXGI_MODE_SCALING_UNSPECIFIED。

但后来我试图确定当前的模式。根据MSDN,当使用IDXGIOutput.FindClosestMatchingMode方法时,如果您不指定其中一个参数,则此方法将倾向于当前的桌面设置,对设置的参数进行排序,并使用某种优先级(ScanlineOrdering>Scaling>Format>Resolution>RefreshRate)来选择其他参数。因此,我创建了设备(为了能够将格式指定为DXGI_FORMAT_UNKNOWN),并将完全未确定的模式传递给该方法(包括Scaling = DXGI_MODE_SCALING_UNSPECIFIED)。

结果如下:

代码语言:javascript
复制
Suggested mode: 32bit B8G8R8A8 UNorm 1600x1024x59Hz Progressive Stretched 
Suggested mode 1.1: 32bit B8G8R8A8 UNorm 1600x1024x59Hz Progressive Stretched Mono

正如您所看到的,它不匹配当前的桌面模式,即1920x1080x60Hz。我尝试将当前的桌面模式更改为不同的模式,发现IDXGIOutput.FindClosestMatchingMode倾向于选择最近的可用模式(参数接近桌面参数,但使用Scaling = DXGI_MODE_SCALING_STRETCHED ),而忽略了我指定的Scaling = DXGI_MODE_SCALING_UNSPECIFIED。

代码语言:javascript
复制
Current mode: 32bit B8G8R8A8 UNorm 1024x768x75Hz Progressive Unspecified
Suggested mode: 32bit B8G8R8A8 UNorm 1280x768x59Hz Progressive Stretched 
Suggested mode 1.1: 32bit B8G8R8A8 UNorm 1280x768x59Hz Progressive Stretched Mono 

这使我得出了一个惊人的结论,即对于缩放参数(至少对于IDXGIFactory.CreateSwapChain方法),DXGI_MODE_SCALING_UNSPECIFIED被视为无效值(否则,为什么用于选择模式的IDXGIOutput.FindClosestMatchingMode,(在大多数情况下将提供给IDXGIFactory.CreateSwapChain )拒绝选择1920x1080x60Hz?)。

我猜IDXGIFactory.CreateSwapChain甚至会在内部调用IDXGIOutput.FindClosestMatchingMode来确定使用哪种“物理”模式。但后来..。什么意思?我不能提供模式,这没有缩放= DXGI_MODE_SCALING_CENTERED或DXGI_MODE_SCALING_STRETCHED的用户,因为这种模式不是“物理”的-也就是说,无论如何IDXGIFactory.CreateSwapChain会选择其他模式?

但是为什么在可用模式列表中返回DXGI_MODE_SCALING_UNSPECIFIED呢?如果只在调用IDXGIFactory.CreateSwapChain方法指定图像中心或缩放时才使用缩放参数,则如果提供的模式与任何“物理”模式不匹配,并且在调用IDXGISwapChain.ResizeTarget,时未使用,则此方法只需要“物理”模式,那么为什么缩放参数混合在一个列表中,由IDXGIOutpit.GetDisplayModeList返回

我应该向用户显示什么模式?只有那些,有缩放的<> DXGI_MODE_SCALING_UNSPECIFIED?还是我该做相反的事?以及如何通过DXGI本身来确定当前模式,而不是使用遗留的Win API?

有人能给我解释一下吗?因为在MSDN中没有关于它的任何澄清。

EN

回答 1

Stack Overflow用户

发布于 2015-03-17 14:30:22

这个问题已经困扰我很长时间了,但是突然间,当我决定问别人这个问题时,我有了一个洞察力,自己回答了我的问题。我最初的假设是正确的-问题在于DXGI或我的显卡驱动程序的奇怪行为。

问题在于,由于一些未知的原因,DXGI或我的视频驱动程序总是将我当前的桌面模式视为DXGI_MODE_SCALING_STRETCHED而不是DXGI_MODE_SCALING_UNSPECIFIED。这是所有问题的根源,因为当“吸引到当前桌面模式”生效时,模式被缩放参数第一次过滤的事实,会导致可怕的结果。

这就是发生的事情:

我当前的桌面模式是

代码语言:javascript
复制
32bit B8G8R8A8 UNorm 1920x1080x60Hz Progressive Stretched (instead of Unspecified)

IDXGIOutput.FindClosestMatchingMode试图找到最接近它的模式,但首先通过缩放模式进行筛选。问题在于,实际上,在比例= DXGI_MODE_SCALING_STRETCHED的情况下,没有1920x1080x60Hz模式。这就是为什么不选择1920x1080x60Hz,而是选择与DXGI_MODE_SCALING_STRETCHED最接近的模式,即1600x1024x59Hz。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29093725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档