Viewの作成
-DirectX11編-
概要
DirectX11の初期化でDevice、SwapChainの初期化が終わったら 次は「RenderTargetView」「StencilView」「DepthView」の作成を行います。 まだ、DeviceとSwapChainの作成が終わっていない方はこちらから作成を行ってください。
サンプル
サンプルはここからダウンロードでき、環境については以下の内容となっています。
VSのバージョン | DirectXのバージョン |
---|---|
VisualStudio 2017 | DirectX11 |
RenderTargetView概要
RenderTargetViewはレンダリングパイプラインからアウトプットされる ピクセル情報を保存するViewです。 このViewの内容をゲーム画面に反映させます。
RenderTargetViewの作成
RederTargetViewはSwapChainが持つバッファを使用して作成するので、 IDXGISwapChainの「GetBuffer」でバッファを取得します。
内容 | スワップチェーンのバッファの1つを取得する | |
---|---|---|
戻り値 | 取得の成否(HRESULT)が返る | |
引数の型 | 説明 | |
UINT | バッファのインデックス(基本は0) | |
REFIID | 取得するバッファのインターフェースID | |
void ** | バッファの取得先 voidポインタのアドレスで取得する |
内容 | RnderTargetViewの作成を行う | |
---|---|---|
戻り値 | 取得の成否(HRESULT)が返る | |
引数の型 | 説明 | |
ID3D11Resource* | 作成するバッファのリソース | |
const D3D11_RENDER_TARGET_VIEW_DESC * | 作成するViewの設定内容データの指定 (nullptrでデフォルト設定になる) |
|
ID3D11RenderTargetView** | 作成されたRenderTargetViewを 格納するためのポインタのアドレス |
サンプルコード
以下はサンプルプロジェクトから今回の説明文を抜粋したコードです。
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の情報を共有しています。
DepthView概要
DepthViewはピクセルの描画をするかどうかを判断する深度情報を保持するViewです。 Depthについてはここに書いてあります。
StencilView概要
StencilViewはピクセルの描画をするかどうかを判断するマスク情報を保持するViewです。 Stencilについてはここに書いてあります。
DepthStencilView作成
DepthStencilViewの作成はID3D11Deviceの「CreateDepthStencilView」で作成しますが 作成にはViewとして使用するためのバッファの作成とViewの設定を行う必要があります。
バッファの作成
バッファの作成はID3D11Deviceの「CreateTexture2D」で作成されたテクスチャを バッファとして使用しますが、この関数を使用するには「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で問題ない |
内容 | 指定された情報を元にしたテクスチャの作成を行う | |
---|---|---|
戻り値 | 取得の成否(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に関する設定を行います。
型 | メンバ名 | 説明 |
---|---|---|
DXGI_FORMAT | Format | Viewのフォーマット |
D3D11_DSV_DIMENSION | ViewDimension | テクスチャの種類 ここで設定した値によってD3D11_TEX2D_DSVが決まる |
UINT | Flags | 読み取り専用フラグ D3D11_DSV_FLAGで読み取り専用の設定ができる |
D3D11_TEX2D_DSV | Texture2D | 使用するTextureデータ情報 ※この変数はunionなので別の変数としても扱われる |
内容 | 指定された情報を元にして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;
}