Viewの作成
-DirectX11編-

概要

DirectX11の初期化でDevice、SwapChainの初期化が終わったら
次は「RenderTargetView」「StencilView」「DepthView」の作成を行います。
まだ、DeviceとSwapChainの作成が終わっていない方はこちらから作成を行ってください。

サンプル

サンプルはここからダウンロードでき、環境については以下の内容となっています。

開発環境
VSのバージョン DirectXのバージョン
VisualStudio 2017 DirectX11

RenderTargetView概要

RenderTargetViewはレンダリングパイプラインからアウトプットされる
ピクセル情報を保存するViewです。
このViewの内容をゲーム画面に反映させます。

RenderTargetViewの作成

RederTargetViewはSwapChainが持つバッファを使用して作成するので、
IDXGISwapChainの「GetBuffer」でバッファを取得します。

GetBuffer
内容 スワップチェーンのバッファの1つを取得する
戻り値 取得の成否(HRESULT)が返る
引数の型 説明
UINT バッファのインデックス(基本は0)
REFIID 取得するバッファのインターフェースID
void ** バッファの取得先
voidポインタのアドレスで取得する
無事、バッファの取得が完了したらID3D11Deviceの「CreateRenderTargetView」を使用して RenderTargetViewの作成を行います。
CreateRenderTargetView
内容 RnderTargetViewの作成を行う
戻り値 取得の成否(HRESULT)が返る
引数の型 説明
ID3D11Resource* 作成するバッファのリソース
const D3D11_RENDER_TARGET_VIEW_DESC * 作成するViewの設定内容データの指定
(nullptrでデフォルト設定になる)
ID3D11RenderTargetView** 作成されたRenderTargetViewを
格納するためのポインタのアドレス
第2引数は詳細な設定を行う場合は、D3D11_RENDER_TARGET_VIEW_DESCの 各項目に設定を行いますが、デフォルトで問題ない場合はnullptrを指定します。
サンプルコード
以下はサンプルプロジェクトから今回の説明文を抜粋したコードです。

bool DirectX::CreateRenderTargetView()
{
	// RenderTargetViewの対象となるBufferの取得
	ID3D11Texture2D* back_buffer;
	if (FAILED(m_SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&back_buffer)))
	{
		return false;
	}
	
	// BufferからRenderTargetViewの作成
	if (FAILED(m_Device->CreateRenderTargetView(back_buffer, NULL, &m_RenderTargetView)))
	{
		return false;
	}
	
	// Targetの取得終わったのでBufferを解放
	back_buffer->Release();

	return true;
}

Viewの作成で使ったバッファはこれ以降で使用する予定がなければReleaseで解放を行います。
これはGetBufferで取得したバッファは、参照カウンタが1加算されているため、
Releaseを行わないとメモリリークの原因となるからです。

DepthStencilView概要

DepthStencilViewはDepthとStencilの二つの機能を持ったViewです。
DirectXでは以下のようにバッファ内の1データの中でDepthとStencilの情報を共有しています。

gmpg_0119

DepthView概要

DepthViewはピクセルの描画をするかどうかを判断する深度情報を保持するViewです。
Depthについてはここに書いてあります。

StencilView概要

StencilViewはピクセルの描画をするかどうかを判断するマスク情報を保持するViewです。
Stencilについてはここに書いてあります。

DepthStencilView作成

DepthStencilViewの作成はID3D11Deviceの「CreateDepthStencilView」で作成しますが
作成にはViewとして使用するためのバッファの作成とViewの設定を行う必要があります。

バッファの作成

バッファの作成はID3D11Deviceの「CreateTexture2D」で作成されたテクスチャを
バッファとして使用しますが、この関数を使用するには「D3D11_TEXTURE2D_DESC」で
テクスチャの設定を行う必要があります。

D3D11_TEXTURE2D_DESC構造体メンバ
メンバ名 説明
UINT Width バッファの横幅
UINT Height バッファの縦幅
UINT MipLevels ミップマップのレベル指定
UINT ArraySize テクスチャ配列のサイズ指定
DXGI_FORMAT Format テクスチャのフォーマット
DXGI_FORMAT_D24_UNORM_S8_UINTを使うと
Depth24bit、Stencil8bitとなる
DXGI_SAMPLE_DESC SampleDesc マルチサンプリング設定
※DepthStencilのバッファでは必要ありません
D3D11_USAGE Usage テクスチャの使用方法
UINT BindFlags Bind設定
D3D11_BIND_DEPTH_STENCILを指定する
UINT CPUAccessFlags リソースへのCPUのアクセス権限設定
デフォルトは0で問題ない
UINT MiscFlags リソースオプションのフラグ
※今回のバッファでは必要ないので0で問題ない
上記の構造体に設定を行った後は、CreateTexture2Dを使用します。
CreateTexture2D
内容 指定された情報を元にしたテクスチャの作成を行う
戻り値 取得の成否(HRESULT)が返る
引数の型 説明
const D3D11_TEXTURE2D_DESC* 作成するテクスチャの詳細情報
const D3D11_SUBRESOURCE_DATA* テクスチャの情報に付与するデータ指定する
読み込んだ画像データを設定したりする
ID3D11Texture1D** 作成されたTextureを格納するためのポインタのアドレス
サンプルコード
以下はサンプルプロジェクトからTexture作成部分を抜粋したコードです。

HWND window_handle = FindWindow(Window::ClassName, nullptr);
RECT rect;
GetClientRect(window_handle, &rect);

//深度ステンシルバッファ作成
D3D11_TEXTURE2D_DESC texture_desc;
ZeroMemory( &texture_desc, sizeof( D3D11_TEXTURE2D_DESC ) );
texture_desc.Width              = (rect.right - rect.left);			// 横幅
texture_desc.Height             = (rect.bottom - rect.top);			// 縦幅
/*
	ミップマップのレベル指定
		どのレベルまで生成するかという設定
		1はマルチサンプリングされたテクスチャを使用するあるので、
		ミップマップはなしと考えられる
		0は全生成とあるので可能な限りのレベルまでテクスチャが生成されると思われる
*/
texture_desc.MipLevels          = 1;
/*
	テクスチャ配列のサイズ指定
		テクスチャ配列について調べ切れていないので
		他のサンプルと同様に1を設定しておく
*/
texture_desc.ArraySize          = 1;
/*
	テクスチャのフォーマット
		DXGI_FORMAT_D24_UNORM_S8_UINTを使用する
		これはおそらくDepth24bit、Stencil8bitとされると思う

		※.UNORMはUnsigned NORMalizedの略で指定された範囲を0.0~1.0にするみたい
*/
texture_desc.Format             = DXGI_FORMAT_D24_UNORM_S8_UINT;	// テクスチャーフォーマット
// マルチサンプリング設定(使わない)
texture_desc.SampleDesc.Count   = 1;								
texture_desc.SampleDesc.Quality = 0;
texture_desc.Usage              = D3D11_USAGE_DEFAULT;			// テクスチャの使用方法(デフォルト)
texture_desc.BindFlags          = D3D11_BIND_DEPTH_STENCIL;		// Bind設定はDepth、Stencilに設定
/*
	リソースへのCPUのアクセス権限についての設定
		ReadとWriteがあるが、権限について現状は考える必要はないはずなので、
		デフォルト値であると思われる0をしておく

		※.readとwriteはenum(D3D11_CPU_ACCESS_FLAG)で用意されていた

*/
texture_desc.CPUAccessFlags     = 0;
/*
	リソースオプションのフラグ
		Microsoft Docsでフラグを確認する限りは
		通常使用でフラグを設定する必要はないと思われるので
		0としておく	
*/
texture_desc.MiscFlags          = 0;

// texture_descの情報でテクスチャを作成
if (FAILED(m_Device->CreateTexture2D(&texture_desc, NULL, &m_DepthStencilTexture)))
{
	return false;
}


Viewの作成

DSV(DepthStencilView)の作成はID3D11Deviceの「CreateDepthAndStencilView」で
行いますが、上で作成したTextureと「D3D11_DEPTH_STENCIL_VIEW_DESC」が必要です。
D3D11_DEPTH_STENCIL_VIEW_DESCにはDSVに関する設定を行います。

D3D11_DEPTH_STENCIL_VIEW_DESC構造体メンバ
メンバ名 説明
DXGI_FORMAT Format Viewのフォーマット
D3D11_DSV_DIMENSION ViewDimension テクスチャの種類
ここで設定した値によってD3D11_TEX2D_DSVが決まる
UINT Flags 読み取り専用フラグ
D3D11_DSV_FLAGで読み取り専用の設定ができる
D3D11_TEX2D_DSV Texture2D 使用するTextureデータ情報
※この変数はunionなので別の変数としても扱われる
設定が完了したらCreateDepthStencilViewを使用します。
CreateDepthStencilView
内容 指定された情報を元にしてDSVの作成を行う
戻り値 取得の成否(HRESULT)が返る
引数の型 説明
ID3D11Resource* View作成に使用するリソース
const D3D11_DEPTH_STENCIL_VIEW_DESC* DSVに関する設定を行ったデータ
ID3D11DepthStencilView** 作成されたDSVを格納するためのポインタのアドレス
サンプルコード
以下はサンプルプロジェクトからDepthStencilView作成部分を抜粋したコードです。

// Depth、StencilViewの設定
// DepthStencilView 
D3D11_DEPTH_STENCIL_VIEW_DESC dsv_desc;
ZeroMemory( &dsv_desc, sizeof( dsv_desc ) );
dsv_desc.Format             = texture_desc.Format;			// Viewのフォーマット(Textureのものを使用)
/*
	DSVが何次元であるかとTextureの種類を設定する値
		D3D11_DSV_DIMENSION_TEXTURE2Dのほかにも
		D3D11_DSV_DIMENSION_TEXTURE1Dや
		D3D11_DSV_DIMENSION_TEXTURE2D_ARRAYなどがあったので
		DSVが何次元であるかとTextureの種類を設定するメンバと思われる
		今回は何も通常のTextureとして用意しているはず、
		なので、D3D11_DSV_DIMENSION_TEXTURE2Dを指定
*/
dsv_desc.ViewDimension      = D3D11_DSV_DIMENSION_TEXTURE2D;	
dsv_desc.Texture2D.MipSlice = 0;					// 最初に使用するミップマップのレベルを指定 

// CreateTexture2Dとdsv_descからDepthとStencilバッファを作る
if (FAILED(m_Device->CreateDepthStencilView(
			m_DepthStencilTexture,				// DSVとして使用されるTexture
			&dsv_desc,					// DSVの設定
			&m_DepthStencilView)))				// ID3D11DepthStencilViewの出力先
{
	return false;
}