以下の3つのワードは、DirectX11を使用していると必ず出てくるものです。
- リソース(Resource)
- バッファー(Buffer)
- サブリソース(SubResource)
この記事では、これらのワードをDirectX11というコンテキストを元にできるだけかみ砕いてわかりやすく解説していきます。
DirectX12の場合、仕組みが変わっている可能性があるのであくまでも参考程度に考えてください
DirectX周りで基礎的な知識について不安がある場合、以下の記事を読んでからのほうが理解がし易いと思います。合わせて御覧ください
リソース、バッファー、サブリソースこれらのワードはどれも深く結びついています。
端的に説明すると以下のような説明になります。
- バッファー : リソースを配置したVRAM上の領域の呼び方
- リソース : データ本体
- サブリソース : リソースの詳細データ
実際のDirectXのコードでは以下のようなメソッド、変数を使ってリソース・バッファ・サブリソースを作成されています。
- D3D11_BUFFER_DESC
- D3D11_SUBRESOURCE_DATA
- CreateBuffer()
- IASetVertexBuffers()
バッファはDirectXのコンテキストでは「メモリ上に連続でデータを記録する領域」という意味で使われています。
よく使うバッファという言葉は、「とりあえず確保した領域」などの意味合いが多いですが、DirectXのコンテキストでは少し意味合いが異なることに注意が必要です。
このときの、「メモリ上」というワードで引っかかりが出ると思います。
DirectXを使っていると、RAM(CPU側)のことなのかVRAM(GPU側)のことなのかが重要になるからです。
答えとしては、ここで出てくるメモリが指しているのは「GPU上の」メモリつまりVRAMです。
CreateBufferメソッドを実行すると戻り値として「VRAM」上に生成したバッファ領域のポインタが取得できるので、CPU上でそれをIASetVertexBufferなどで渡して上げることでバッファー領域とバッファーを使用する処理との紐づけができます。
VertexBufferのBufferはメモリ領域のというよりは、「頂点の配列」のようなニュアンスなのかなと思うようにしています。
この命名も理解に苦しむ一要因だと思います。。
詳しくといったものの、リソースは単純によく知られている言葉と置き換えができます。
「リソース = データ」この理解でいいと思います。
データとリソースの違いは、どこにあるのかの違いで、以下のようなものだと考えていいと思います。
- データ : CPUが扱うメモリ上(RAM)
- リソース : GPUが扱うメモリ上(VRAM)
一つ違うのを上げるとすれば、CPU上で扱うデータをファイルだとしたら、GPU上で扱うリソースは、フォルダのようなイメージになることです。
同じデータにはかわりがないのですが、リソースのほうが構造化(サブリソースとして内部で分割している)されています。
サブリソースは、リソースの内部にあるデータの細かい塊です。
頂点バッファなどのバッファ系のリソースでは、基本的にサブリソースは1つなのですが、テクスチャ周りのリソースには内部に複数のサブリソースが含まれている場合が多いです。
これは、1つのリソースを複数の解像度で使いたい場合などに便利なのでこのように別れています。
サブリソースが有用なレイヤ「ミップマップ」などを理解すると理解しやすいと思います。
以下とても参考になる記事です。
この記事では、現状の私の中の理解を言語化してみました。
もしかしたら大きな間違いや理解が足りていない部分があるかもしれません。
そのような点を見つけた心優しい方がいましたら、記事へのコメントやTwitter(X)へご連絡いただけますととても嬉しいです。