DirectX12 備忘録

##はじめに
DirectX12の個人的なメモ。
概念的なところから、実装まで覚えたことをここに書いていこうと思います。
※あくまで個人的な解釈なので、誤った情報もある可能性があります。

##リンク集
- DirectX用語集 (https://msdn.microsoft.com/ja-jp/library/cc351166.aspx)

##概念

### [DXGI](https://msdn.microsoft.com/ja-jp/library/ee415671(v=vs.85).aspx)
より低レベルな部分を管理し、情報を提供するレイヤー？各バージョンのDirectXで使用することができるらしい。
アダプターの列挙やスワップチェインの作成等をしてくれる。

- [IDXGIFactory～](https://msdn.microsoft.com/ja-jp/library/ee421911(v=vs.85).aspx)  
  DXGIの各種オブジェクトを生成するクラス(だと思う・・・)。
  現在はIDXGIFactory無印～7まで存在するらしい。末尾の数字が上がるとできることが増えるが、OSのバージョン依存がでてくるっぽい。
  [こちらのブログ](http://blog.livedoor.jp/aerial2007/archives/50956028.html)に詳しいことが書いてあった。  

### [デバイスクラス](https://docs.microsoft.com/ja-jp/windows/desktop/direct3d11/overviews-direct3d-11-devices-intro)とは?  
どうやらDirectX12以前から存在する概念らしい。要は接続されているグラフィックボードの情報を詰め込んだクラス。

### サーフェス(surface)
ざっくり言うとリソースを格納するメモリのこと言うらしい

### フリップモデル
参考になりそうなサイト
https://docs.microsoft.com/ja-jp/windows/desktop/direct3ddxgi/dxgi-flip-model
https://docs.microsoft.com/ja-jp/windows/desktop/direct3ddxgi/for-best-performance--use-dxgi-flip-model


### コマンドキュー、コマンドリスト、コマンドアロケータ
/***********書く予定****************/



##関数たち
### [IID_PPV_ARGS](https://docs.microsoft.com/en-us/windows/desktop/api/combaseapi/nf-combaseapi-iid_ppv_args)
引数に与えたインターフェイスのGUIDとポインタをカンマ区切りで返すマクロ。

---------------------

### [D3D12CreateDevice](https://docs.microsoft.com/en-us/windows/desktop/api/d3d12/nf-d3d12-d3d12createdevice)
デバイスを作成する関数

- 第1引数 IUknown *pAadapter  
  使用するデバイスを指定します。NULLを指定すると、デフォルトのアダプターが選択されます。
  デフォルトのアダプターというのはIDXGIFacory1::EnumAdaptersで一番最初に取得できるアダプター。
- 第2引数 [D3D_FEATURE_LEVEL](https://msdn.microsoft.com/ja-jp/library/ee417660(v=vs.85).aspx) *MinimumFeatureLevel  
  デバイス作成をするために必要な最小の機能レベル。シェーダーモデルとかDirectXのバージョンとかを指定。

------------------

### [CreateDXGIFactory1](https://msdn.microsoft.com/ja-jp/library/ee415212%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396)
IDXGIFactoryインターフェイスを生成する。末尾の数字は1に限定されていないようで、自分が見たサンプルとかだとIDXGIFactory4とかを渡してたりしてた。
- 第1,2引数 REFIID riid, void **ppFactory
IDXGIFactory1のGUIDとポインタを指定する。
- 戻り値 HRESULT
  S_OK か DXGI_ERRORのいずれかを返す。

--------------------

### [CreateCommandQueue](https://docs.microsoft.com/en-us/windows/desktop/api/d3d12/nf-d3d12-id3d12device-createcommandqueue)
文字通りコマンドキューを作成する関数

[D3D12_COMMAND_QUEUE_DESC](https://docs.microsoft.com/ja-jp/windows/desktop/api/d3d12/ns-d3d12-d3d12_command_queue_desc)

- D3D12_COMMAND_LIST_TYPE Type  
  コマンドリストのタイプ  
  詳しいことは[こちらのブログ](https://hexadrive.jp/hexablog/program/13072/)に書いてあった      
- INT Priority  
  プライオリティなので処理優先度だと思う。自分は今の所何も指定してない
- D3D12_COMMAND_QUEUE_FLAGS Flags  
  デフォルトか、タイムアウトを無効にするパラメータの2種類が存在する。
- UINT NodeMask  
  GPU複数存在する場合に使うらしい

--------------------

### [CreateSwapChain](https://docs.microsoft.com/ja-jp/previous-versions/direct-x/bb174537(v=vs.85))
スワップチェーンを作成する関数
全画面とウィンドウモードだとフロントバッファが違うらしい。一応覚えておこう。

- 第１引数 IUnknown *pDevice  
  描画関係を担っているクラスなのでDirectX12だとCommandQueue、DirectX11以前だとDeviceクラスを設定する。

[DXGI_SWAP_CHAIN_DESC](https://docs.microsoft.com/en-us/windows/desktop/api/dxgi/ns-dxgi-dxgi_swap_chain_desc)

- UINT BufferCount
  バッファの数(フロントバッファ込み)
- DXGI_SWAP_EFFECT SwapEffect  
  サーフェスの後処理を指定する
- UINT Flags  
  スワップチェーンがどういった挙動をしてほしいかを細かく指定できる。必要になったらドキュメント読もう

[DXGI_MODE_DESC](https://msdn.microsoft.com/en-us/library/windows/desktop/bb173064(v=vs.85).aspx)
バックバッファの表示モード

- DXGI_RATIONAL　RefreshRate  
  リフレッシュレートだけど特になにも指定しなくてもいいかも 
- DXGI_FORMAT Format  
  表示のフォーマット。詳細は[DXGI_FORMAT](https://msdn.microsoft.com/ja-jp/library/bb173059(v=vs.85).aspx)を参照(多い) 
- DXGI_MODE_SCANLINE_ORDER ScanlineOrdering  
  走査線の描画順とかを指定できるけど、いじる機会がなさそう
- DXGI_MODE_SCALING　Scaling  
  モニターの解像度によって何やらスケーリングするらしいのだけれども今の所特に使いそうもない・・・

[DXGI_SAMPLE_DESC](https://docs.microsoft.com/en-us/windows/desktop/api/dxgicommon/ns-dxgicommon-dxgi_sample_desc)
マルチサンプリングの設定

-  UINT Count  
   サンプル数
-  UINT Quality
   マルチサンプリングのクオリティ

[DXGI_USAGE](https://docs.microsoft.com/en-us/windows/desktop/direct3ddxgi/dxgi-usage)
バックバッファのメモリに関する細かいことを指定できる

[DXGI_SWAP_EFFECT](https://docs.microsoft.com/en-us/windows/desktop/api/dxgi/ne-dxgi-dxgi_swap_effect)
描画後のバッファ(?)の処理方法を指定する

[DXGI_SWAP_CHAIN_FLAG](https://docs.microsoft.com/en-us/windows/desktop/api/dxgi/ne-dxgi-dxgi_swap_chain_flag)

- 

--------------------