DirectX11程式設計2 紅龍書第四章練習

2021-08-26 17:57:11 字數 3762 閱讀 4285

環境:vs2017  語言:c++

根據上一次的博文,龍書第四章後面有一些練習題,這邊正好做一下。

1.這邊的程式都是以win64執行的;

2.如果沒有找到common指令碼,請到工程/屬性/vc++目錄中新增包含目錄「../common」;

4.所有的練習都在工程中,全域性搜尋「練習4」關鍵字就能找到,想要執行開啟注釋即可。

有任何的錯誤,請大佬們指正。

1.讓alt+enter方式切換全屏/視窗無效。答:

// 練習4.1,在createswapchain函式呼叫後新增

hr(dxgifactory->makewindowassociation(mhmainwnd, dxgi_mwa_no_window_changes));

makewindowassociation第二個引數可以填寫三種值:

1)dxgi_mwa_no_window_changes,禁用全屏/視窗轉換;

2)dxgi_mwa_no_alt_enter,禁用alt+enter的螢幕切換;

3)dxgi_mwa_no_print_screen,禁用print screen鍵。

2.列印所有顯示卡的數量。答:

// 練習4.2

uint i = 0;

idxgiadapter* adapter = 0;

std::vectoradapters;

while (dxgifactory->enumadapters(i, &adapter) != dxgi_error_not_found)

adapters.push_back(adapter);

i++;

}std::wostringstream outs;

outs << mmainwndcaption << l"顯示卡數量:" << adapters.size()<< l"\n" ;

outputdebugstring(outs.str().c_str());

效果:

關於microsoft basic render driver是在沒有安裝顯示卡驅動的情況下,使用基本通用驅動來執行gpu。

**實際練習下來,連打log都不會了,要不要這麼難……

3.檢查當前顯示卡是否支援dx11答:

// 練習4.3,checkinte***cesupport方法只能用於檢測dx10和vista以上系統,如果需要檢測則直接建立介面,建立成功則支援(例如 id3d11device::createblendstate)

for (size_t i = 0; i < adapters.size(); i++)

else

// 使用createblendstate函式判斷是否支援dx11

id3d11device* device;

hresult hr = d3d11createdevice(

adapter, // 使用指定的顯示卡

d3d_driver_type_unknown,

0,createdeviceflags,

0, 0,

d3d11_sdk_version, // 我們使用dx11的sdk

&device,0,0);

if (failed(hr))

id3d11blendstate* m_blendstate;

d3d11_blend_desc blenddesc = ;

blenddesc.rendertarget[0].blendenable = true;

blenddesc.rendertarget[0].srcblend = d3d11_blend_src_alpha; // color_fsrc

blenddesc.rendertarget[0].destblend = d3d11_blend_inv_src_alpha; // color_fdst

blenddesc.rendertarget[0].blendop = d3d11_blend_op_add; // color_operation

blenddesc.rendertarget[0].srcblendalpha = d3d11_blend_one; // alpha_fsrc

blenddesc.rendertarget[0].destblendalpha = d3d11_blend_zero; // alpha_fdst

blenddesc.rendertarget[0].blendopalpha = d3d11_blend_op_add; // alpha_operation

blenddesc.rendertarget[0].rendertargetwritemask = d3d11_color_write_enable_all;

if (failed(device->createblendstate(&blenddesc, &m_blendstate)))

else

releasecom(m_blendstate);

releasecom(device);

}

書上說讓我們用checkinte***cesupport,但是一查發現不支援dx11,google了一下,發現該方法只能用於dx10,真正有需要的話請用後面的方法吧。

4.輸出預設顯示卡使用的顯示器數量。答:

// 練習4.4

auto adapterdef = adapters[0];

idxgioutput* output;

std::vectoroutputs;

uint index = 0;

while (adapterdef->enumoutputs(index, &output) != dxgi_error_not_found)

std::wostringstream outs1;

outs1 << mmainwndcaption << l"顯示器數量:" << outputs.size() << l"\n";

outputdebugstring(outs1.str().c_str());

跟獲取adapter差不多,這類方法呼叫已經很熟練了。

每次打log也蠻煩的,這邊還是定義兩個巨集好了:

#define log2(x, y)

#define log3(x, y, z)

效果:

5.列印當前顯示器所支援的解析度和重新整理率

// 練習4.5

for (size_t i = 0; i < outputs.size(); i++)

}

效果:

6.嘗試使用不同的viewport引數顯示遊戲。

嘗試下來沒有發什麼不同,看別的博主說需要填充其他東西才能看的出來,到時候再補一張吧。

執行skull demo的效果:

DirectX11渲染過程

網易作業deadline 要涼了555 對directx初始化完成後,就可以進行渲染了。struct vs input 輸入資料的格式 struct vs output 輸出資料的格式 vs output main vs input input 編譯之後生成cso檔案,使用readfiletoblo...

DirectX 11遊戲程式設計學習筆記之1 開場白

本文由哈利 2024958085 qq.com 這是我之前的部落格系列 directx9.0c遊戲開發手記之 龍書 第二版學習筆記 的平行版,也可以說是續集。說是平行版,因為這兩個部落格系列因為某種顯而易見的原因,內容是很平行的 而之所以說是續集,是因為前面那個系列可能就此坑掉了 前面那個系列是關於...

DirectX11與遊戲程式設計學習路線自擬

最近學習了龍書 dx11版本 簡要的翻了翻,對於初學者還是有很大的難度。因此,制定了下關於學習遊戲程式設計以及遊戲引擎的路線。學習遊戲引擎之前需要了解一下如何使用遊戲引擎 我打算從unity3d入手,先了解遊戲引擎所具備的功能,對於遊戲引擎有初步的了解。目標 實現demo,可以做出乙個小專案。可以按...