DirectXで画面分割



このようにDirectXで画面分割する方法を紹介します。

概要

DirectXは描画する際に様々な行列を使用するのですが、その1つにビューポート行列というものがあります。このビューポート行列を描画前に設定することにより、画面分割を行うことが出来ます。

コード

const float FRAME_BUFFER_W = 1280.0f;   //フレームバッファの幅。
const float FRAME_BUFFER_H = 720.0f;   //フレームバッファの高さ。
Model* modelList;   //3Dモデルのリスト
ID3D11DeviceContext* d3dDeviceContext;   //D3D11デバイスコンテキスト、初期化済みとする
D3D11_VIEWPORT viewPorts[2];   //分割ビューポート、これをモデルの描画前に設定する

//ビューポート初期化
{
    //これが上画面
    viewPorts[0].Width = FRAME_BUFFER_W;   //画面の横サイズ
    viewPorts[0].Height = FRAME_BUFFER_H / 2;   //画面の縦サイズ
    viewPorts[0].TopLeftX = 0;   //画面左上のx座標
    viewPorts[0].TopLeftY = 0;   //画面左上のy座標
    viewPorts[0].MinDepth = 0.0f;   //深度値の最小値
    viewPorts[0].MaxDepth = 1.0f;   //深度値の最大値

    //これが下画面
    viewPorts[1].Width = FRAME_BUFFER_W;   //画面の横サイズ
    viewPorts[1].Height = FRAME_BUFFER_H / 2;   //画面の縦サイズ
    viewPorts[1].TopLeftX = 0;   //画面左上のx座標
    viewPorts[1].TopLeftY = FRAME_BUFFER_H / 2;   //画面左上のy座標
    viewPorts[1].MinDepth = 0.0f;   //深度値の最小値
    viewPorts[1].MaxDepth = 1.0f;   //深度値の最大値
}

//描画するぜ
{
    //ビューポートの数だけfor文を回す
    for(int i = 0; i < sizeof(viewPorts) / sizeof(viewPorts[0]); i++) {
        //ビューポートを設定
        d3dDeviceContext->RSSetViewports(1, viewPorts[i]);
        //モデルを描画
        for(Model* model : modelList) {
            //描画
            model->Draw();
        }
    }
}