下面答案仅供參考,有错欢迎留言。

Chapter 4:Direct3D Initialzation

  

1. Modify the previous exercise solution by disabling the ALT-ENTER functionality to switch between full screen and windowed mode;  use the IDXGIFactory::MakeWindowAssociation method
and specify the DXGI_MWA_NO_WINDOW_CHANGES flag so that DXGI does not monitor the message queue. Note that the IDXGIFactory::MakeWindowAssociation method needs to be called after IDXGIFactory::CreateSwapChain is called.

 

意思是禁用框架代码提供的ALT-ENTER键功能,即全屏和窗体模式间的切换。

按要求加入代码(注意加入在创建交换链之后):

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

DXGI应该是利用Hook窗体消息处理过程,监听ALT+ENTER按键,来实现自己主动的在窗体模式和全屏模式切换。而用DXGI_MWA_NO_WINDOW_CHANGES能够指定取消监听程序消息队列。来"取消"此功能。

为了满足好奇心能够用VS工具菜单下的Spy++来检測ALT-ENTER所发送的窗体消息:

过滤掉全部已知的消息= =。剩下的未知消息应该会包括发送给DXGI的消息吧(我自己的推測...)

这个窗体正常执行时会一直SendMessage和return一个标识为0x00AE的消息。

而在按下ALT+ENTER切换全屏时。则有额外的0x0093、0x0094消息...

所以93、94消息即为DXGI所监听的消息。

然后呢,我们调用DXGIFactory::MakeWindowAssociation以后再用spy++看看...

这次怎么按ALT-ENTER都不会出现93、94消息了,而仅仅是一直在发送、返回AE消息(= =, 真不知道是干嘛的。

)...

2. Some systems have more than one adapter (video card), and the application may wish to let the user choose which one to use, instead of always using the default adapter. Use the IDXGIFactory::EnumAdapters method to determine
how many adapters are on your system.

意思是说有些系统有多块显卡。让你用DXGI接口给的EnumAdapters来看看究竟是哪几块= =

	// 列出全部找到的显卡设备的信息
UINT i = 0;
IDXGIAdapter* pAdapter;
DXGI_ADAPTER_DESC desc;
ZeroMemory ( &desc, sizeof(desc));
WCHAR adapterInfo[3][256]; // MS Basic Render Driver?
std::vector<IDXGIAdapter*> vAdapters;
while(dxgiFactory->EnumAdapters(i, &pAdapter) != DXGI_ERROR_NOT_FOUND)
{
vAdapters.push_back(pAdapter);
pAdapter->GetDesc(&desc); swprintf_s(adapterInfo[i], L"-----------------\n***显卡名称:%s\n***厂商ID:%u\n***设备ID:%u\n***子系统ID:%u\n***专有显存:%uB\n***专有系统内存:%uB\n***共享的系统内存:%uB\n***LUID:%u%u\n",
desc.Description,desc.VendorId,desc.DeviceId,desc.SubSysId,desc.DedicatedVideoMemory,desc.DedicatedSystemMemory,desc.SharedSystemMemory,desc.AdapterLuid.HighPart,desc.AdapterLuid.LowPart);
OutputDebugStringW(adapterInfo[i]);
++i;
}

考虑到大多数电脑最多也就是双显卡。

。所以存储显卡相关信息的数组仅仅定义了[3][256]。。处理的时候使用的是Unicode字符集,所以字符数组用的是WCHAR。而用于格式化生成输出字符串的sprintf换成了swprintf。加个_s帮忙在越界时提示信息;在调试窗体程序时输出信息到VS的输出窗体最为方便(和MessageBox相比不会影响程序正常执行),所以用OutputDebugStringW来完毕此操作。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />

显存输出的单位是B,即byte,我的独立显卡是2G显存的,这里正好是2*10^9 B,符合~

唯一有点疑惑的是MS Basic Render Driver这个adapter,显然这不是一块真实存在的显卡。。或许是做软件模拟的?。。

至于ADAPTER_DESC里面的LUID(Local Unique IDentifier)我非常外行,输出的时候组合highpart在前,lowpart在后。不知道对不正确。。

3. For each adapter the system possesses, IDXGIFactory::EnumAdapters outputs a pointer to a filled out IDXGIAdapter interface. This interface can be used to query information about the adapter. Use the IDXGIAdapter::CheckInterfaceSupport
method to see if the adapters on your system support Direct3D 11.

	// CheckInterfaceSupport如今失效了...详见MSDN SDK说明
for(std::vector<IDXGIAdapter*>::iterator it=vAdapters.begin(); it!=vAdapters.end(); ++it)
{
if((*it)->CheckInterfaceSupport(__uuidof(ID3D11Device), NULL) == DXGI_ERROR_UNSUPPORTED)
{
OutputDebugStringW(L"11.x版本号如今不能用CheckInterfaceSupport检測~\n");
}
}

经个人測试,我的明明支持dx11的显卡(这一点能够window+R键执行dxdiag看看),检測ID3D11Device时总是会return DXGI_ERROR_UNSUPPORTED,官方的最新说明表示这种方法如今仅仅能Check 10.x了,所以如今请不要用这种方法检測是否支持11.x。如今呢,你要检查显卡是否支持某个特定的接口必须试试看去创建它。。

也就是说。一项一项的检測= =。。想调用融合相关接口那就要去试试ID3D11Device::CreateBlendState是不是返回成功,假设失败就证明不支持。。

这真是个坏消息...

4. An adapter has outputs associated with it (e.g., a monitor). You can use the IDXGIAdapter::EnumOutputs method to enumerate the outputs for a particular adapter. Use this method to determine the number of outputs for the default
adapter.

5. Each output has a list of supported display modes (DXGI_MODE_DESC) for a given pixel format. For each output(IDXGIOutput), show the width, height, and refresh rate of each display mode the output supports for theDXGI_FORMAT_R8G8B8A8_UNORM
format using the IDXGIOutput::GetDisplayModeList method.

意思是显卡(adater)之所以能正确输出到显示器上(monitor)。是由于显卡有支持这块屏幕相应的宽、高、格式等属性,即显卡关联(associated with)显示器。

试着用IDXGIAdapter::EnumOutputs去输出显卡所支持的属性表(Outputs)以及其支持属性的数量(the num of outputs)。

	// 列出全部显卡对本机连接上的显示器的output信息表
IDXGIOutput *pOutput;
WCHAR outputInfo[256];
UINT numScreens = 0;
for(std::vector<IDXGIAdapter*>::iterator it=vAdapters.begin(); it!=vAdapters.end(); ++it)
{
while((*it)->EnumOutputs(numScreens++, &pOutput) != DXGI_ERROR_NOT_FOUND)
{
UINT numOutputs = 0;
pOutput->GetDisplayModeList( DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numOutputs, 0);
DXGI_MODE_DESC* pDescs = new DXGI_MODE_DESC[numOutputs];
pOutput->GetDisplayModeList( DXGI_FORMAT_R8G8B8A8_UNORM, DXGI_ENUM_MODES_INTERLACED, &numOutputs, pDescs); swprintf_s(outputInfo,L"%u\n",numOutputs);
OutputDebugStringW(outputInfo); for(int i=0; i<numOutputs; i++)
{
swprintf_s(outputInfo,L"\n***Width: %u Height: %u\ Format: %u\ RefreshRate: %u",
(pDescs[i]).Width,(pDescs[i]).Height, (pDescs[i]).Format, (pDescs[i]).RefreshRate);
OutputDebugStringW(outputInfo);
}
}
}

在本机測试总共输出了107条支持信息。从320*200一直到1920*1080格式。

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

今天又一次看了下写的东西:

上图输出的刷新率非常不正常,原来RefreshRate并不能直接输出,由于其是一个DXGI_RATIONAL结构体,

typedef struct DXGI_RATIONAL {
UINT Numerator;
UINT Denominator;
} DXGI_RATIONAL;

所以输出的时候须要分子/分母(Numerator/Denominator)。

    swprintf_s(outputInfo,L"\n***Width:   %u  Height:  %u\  Format: %d\  RefreshRate:  %f",
(pDescs[i]).Width,(pDescs[i]).Height, (pDescs[i]).Format, (float)(pDescs[i]).RefreshRate.Numerator/(pDescs[i]).RefreshRate.Denominator);

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

由于我还有块HDMI接口的显示屏外接笔记本所以。。正好測试下会不会输出两份信息~

开启双屏...

双显卡的电脑对同一块显示器不会有两份outputs的原因应该是:双显卡在执行某个程序时并不会两块显卡同一时候火力全开。。而是须要节能时开集成显卡作为主显卡。须要高性能时开独立显卡作为主显卡。

双显卡技术不是太了解= =。至少我还没想通为什么我的双显卡单开独显fps非常低。而开了集显和独显以后fps是仅仅开集显的两倍以上。。或许是我打开方式有问题。。

6. Experiment with modifying the viewport settings to draw the scene into a subrectangle of the back buffer. For example, try:....

按要求改动下d3dAPP::OnResize()里面md3dImmediateContext->RSSetViewports(1, &mScreenViewport)所调用的mScreenViewport属性就能够了,注意至少要画个物体才干观察到变化。。

建议能够使用第六章的BoxDemo啊什么的来试试

龙书D3D11章节习题答案(第四章)的更多相关文章

  1. 《C++Primer》第五版习题解答--第四章【学习笔记】

    [C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...

  2. 《C++Primer》第五版习题答案--第五章【学习笔记】

    <C++Primer>第五版习题答案--第五章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/15 第五章:语句 ...

  3. 《C++Primer》第五版习题答案--第六章【学习笔记】

    <C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...

  4. 《C++Primer》第五版习题答案--第三章【学习笔记】

    [C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...

  5. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第四章:更高级的数据管理

    在这一章我们将学习如何正确地删除分类信息,如何向数据库填充种子数据,如何使用Code First Migrations基于代码更改来更新数据库,然后学习如何执行带有自定义错误消息的验证. 注意:如果你 ...

  6. 快学Scala习题解答—第四章 映射和元组

    4 映射和元组  4.1 设置一个映射,当中包括你想要的一些装备,以及它们的价格.然后构建还有一个映射.採用同一组键,可是价格上打9折 映射的简单操作  ,"gun"->18 ...

  7. DX12龙书第6章习题

    1. { { , DXGI_FORMAT_R32G32B32_FLOAT, , , D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, }, { , DXGI_FO ...

  8. Thinking in Java 4th(Java编程思想第四版)文档、源码、习题答案

    Thinking in Java 4th 中.英文两版pdf文档,书中源码及课后习题答案.链接:https://pan.baidu.com/s/1BKJdtgJ3s-_rN1OB4rpLTQ 密码:2 ...

  9. 数据结构与算法分析:C语言描述(原书第2版 简体中文版!!!) PDF+源代码+习题答案

    转自:http://www.linuxidc.com/Linux/2014-04/99735.htm 数据结构与算法分析:C语言描述(原书第2版中文版!!!) PDF+源代码+习题答案 数据结构与算法 ...

随机推荐

  1. DRF filter

    filter 配置 fiter定义 自定义filter继承BaseFilterBackend,必须重写filter_queryset,返回值为过滤后的queryset filter在GenericAP ...

  2. 【02】markdown在线编辑器

    [01]在线编辑器 https://www.zybuluo.com/mdeditor 在线 Markdown 编辑阅读器 pen - 是一个Markdown编辑器工具.demo 你可以试试这个在线的m ...

  3. 大数据学习——kafka+storm+hdfs整合

    1 需求 kafka,storm,hdfs整合是流式数据常用的一套框架组合,现在 根据需求使用代码实现该需求 需求:应用所学技术实现,kafka接收随机句子,对接到storm中:使用storm集群统计 ...

  4. 在 Yii2 项目中使用 Composer 添加 FontAwesome 字体资源

    2014-06-21 19:05 原文 简体 繁體 2,123 次围观 前天帮同事改个十年前的网站 bug,页面上一堆 include require 不禁让人抱头痛哭.看到 V2EX 上的讨论说,写 ...

  5. 【drp 12】再识转发和重定向:SpringMVC无法跳转页面

    最近再使用SpringMVC进行页面跳转的时候,不知道发生了什么,始终都无法正确跳转.后来问题解决了,发现是对于转发和重定向没有能很好的理解,以此写篇博客,权当做积累了! 声明:本博客的所有代码,均为 ...

  6. POJ 2396 Budget ——有上下界的网络流

    给定矩阵的每行每列的和,和一些大于小于等于的限制.然后需要求出一组可行解. 上下界网络流. 大概的思想就是计算出每一个点他需要强行流入或者流出的量,然后建出超级源点和汇点,然后删除下界,就可以判断是否 ...

  7. [luoguP3172] [CQOI2015]选数(递推+容斥原理)

    传送门 不会莫比乌斯反演,不会递推. 但是我会看题解. 先将区间[L,H]变成(L-1,H],这样方便处理 然后求这个区间内gcd为k的方案数 就是求区间((L-1)/k,H/k]中gcd为1的方案数 ...

  8. [luoguP3413] SAC#1 - 萌数(数位DP)

    传送门 gtm的数位dp! 看到好多题解,都是记忆化搜索,好像非常方便啊,但是我还是用递推好了,毕竟还是有些类似数位dp的题用递推的思路,记忆化做不了,现在多培养一下思路 首先这道题, 只看长度大于等 ...

  9. [BZOJ2733] [HNOI2012]永无乡(并查集 + 线段树合并)

    传送门 一看到第k大就肯定要想到什么权值线段树,主席树,平衡树之类的 然后就简单了 用并查集判断连通,每个节点建立一颗权值线段树,连通的时候直接合并即可 查询时再二分递归地查找 时间复杂度好像不是很稳 ...

  10. 刷题总结——魔法森林(bzoj3669)

    题目: Description 为了得到书法大家的真传,小E同学下定决心去拜访住在魔法森林中的隐士.魔法森林可以被看成一个包含个N节点M条边的无向图,节点标号为1..N,边标号为1..M.初始时小E同 ...