レンダリング


レンダリング開始前にダブルバッファのインデックスをインクリメントします。
	m_pTextureSet->CurrentIndex = (m_pTextureSet->CurrentIndex + 1) % m_pTextureSet->TextureCount;

レンダリングプロセスでは1枚のレンダリングターゲットに左右2枚の映像をレンダリングしますが、レンダリングターゲット自体は1枚なので、以下のようにレンダリングターゲットの準備をします。
	// レンダリングターゲットの準備 //
	ID3D11DeviceContext *pDevCtx = ...;
	ID3D11DepthStencilView *pDepthStencilView = NULL; // 深度バッファが必要な場合はここで設定 //
	pDevCtx->OMSetRenderTargets( 1, m_ppRenderTargetView + m_pTextureSet->CurrentIndex, pDepthStencilView );
	// レンダリングターゲットのクリア //
	static const float ColorRGBA[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
	pDevCtx->ClearRenderTargetView( m_ppRenderTargetView[ m_pTextureSet->CurrentIndex ], ColorRGBA );


左右それぞれの Viewport を設定して、レンダリングします。
	for(int eye=0;eye<2;eye++) {
		// Viewport の設定 //
		D3D11_VIEWPORT View;
		View.TopLeftX = m_OVRLayer.Viewport[eye].Pos.x;
		View.TopLeftY = m_OVRLayer.Viewport[eye].Pos.y;
		View.Width    = m_OVRLayer.Viewport[eye].Size.w;
		View.Height   = m_OVRLayer.Viewport[eye].Size.h;
		View.MinDepth = 0.0f;
		View.MaxDepth = 1.0f;
		pDevCtx->RSSetViewports( 1, &View );
		// このままレンダリングを実行 //
			:
レンダリング自体は普通の DirectX11 によるレンダリングプロセスですが、カメラを以下のように設定します。

プロジェクションマトリックスは、基本的に m_VRProjectionMtx[eye] で置き換えます。
プロジェクションマトリックスが固定値になるので、ゲームの演出上の理由で画角を変更したりすることはできません。
NearZ と FarZ を動的に変更する場合は m_VRProjectionMtx を作り直します。

ビューマトリックスは、VR 空間内のカメラのビューマトリックスに m_VREyeMtx[ eye ] を乗算します。

以上のカメラパラメータを設定した上で、普通の DirectX11 によるレンダリングプロセスを実行します。

			:
		// 1枚分のレンダリングが完了 //
	}
	// レンダリング完了処理 //
	ovrLayerHeader *layers = &m_OVRLayer.Header;
	ovr_SubmitFrame( m_OVRSessionId, 0, NULL, &layers, 1 );
左右のレンダリングが終了したら、SDK による終了処理を実行します。
おそらくこの中で HMD のレンズの歪みを考慮した変形等を含めた転送処理が行われると思います。


back