Microsoft DirectX 8.0 (Visual Basic) |
キューブ マップの個々のサーフェスへは、その他のテクスチャやサーフェス オブジェクトと同じように画像をコピーすることができる。このレンダリングを行う前に実行する最も大切なことは、カメラを正しく配置し、そのサーフェスに対して正しい方向を向くようにトランスフォーム行列を設定することである。正しい方向とは、前方 (+z)、後方 (-z)、左 (-x)、右 (+x)、上方 (+y)、または下方 (-y) である。
次の Microsoft® Visual Basic® コードは、レンダリングするサーフェスに応じて、ビュー行列を用意して設定する。
' ' この例では、CubeMap は有効な Direct3DCubeTexture8 オブジェクトであり、 ' m_D3DDevice は有効な Direct3DDevice8 オブジェクトである。 ' Sub RenderFaces ' デバイスのトランスフォーム行列を保存する。 Dim matProjSave As D3DMATRIX, _ matViewSave As D3DMATRIX m_D3DDevice.GetTransform D3DTS_VIEW, matViewSave m_D3DDevice.GetTransform D3DTS_PROJECTION, matProjSave ' 現在のバック バッファと z バッファを格納する。 Dim BackBuffer As Direct3DSurface8, _ Zbuffer As Direct3DSurface8 Set BackBuffer = m_D3DDevice.GetRenderTarget() Set Zbuffer = m_D3DDevice.GetDepthStencilSurface()
キューブ環境マップの各サーフェスには 90°の視野が含まれることを思い出すこと。アプリケーションで特殊効果などのために視野の角度を変更しない限り、この角度に応じて射影行列を設定するよう注意が必要である。
次のコードは、最も一般的に使用する射影行列を作成および設定する。
' 90°の視野を射影に使用する。 Dim matProj As D3DMATRIX D3DXMatrixPerspectiveFovLH matProj, g_pi/4, 1, 1/2, 1000 m_D3DDevice.SetTransform D3DTS_PROJECTION, matProj ' キューブ マップの 6 つのサーフェスに対してループ処理を実行する。 Dim i As Integer For i = 0 To 6 ' 以下のように、標準ビューをオーバーライドする。 Dim vEnvEyePt As D3DVECTOR, _ vLookatPt As D3DVECTOR, _ vUpVec As D3DVECTOR Select Case i case D3DCUBEMAP_FACE_POSITIVE_X: vLookatPt.x = 1#: vUpVec.y = 1# case D3DCUBEMAP_FACE_NEGATIVE_X: vLookatPt.x = -1#: vUpVec.y = 1# case D3DCUBEMAP_FACE_POSITIVE_Y: vLookatPt.y = 1#: vUpVec.z = -1# case D3DCUBEMAP_FACE_NEGATIVE_Y: vLookatPt.y = -1#: vUpVec.z = 1# case D3DCUBEMAP_FACE_POSITIVE_Z: vLookatPt.z = 1#: vUpVec.y = 1# case D3DCUBEMAP_FACE_NEGATIVE_Z: vLookatPt.z = -1#: vUpVec.y = 1# End Select Dim matView As D3DMATRIX D3DXMatrixLookAtLH matView, vEnvEyePt, vLookatPt, vUpVec m_D3DDevice.SetTransform D3DTS_VIEW, matView
カメラを正しく配置し、射影行列を設定すると、シーンをレンダリングできる。シーンの各オブジェクトは、通常配置するとおりに配置する。次のコードでは、処理全体がわかるようにするため、このタスクの概略を示す。
' レンダリングするキューブ サーフェスを取得する。 Dim Face As Direct3DSurface8 Set Face = CubeMap.GetCubeMapSurface i, 0 m_D3DDevice.SetRenderTarget Face, Zbuffer Set Face = Nothing m_D3DDevice.BeginScene ' ここで、シーンをレンダリングする。 m_D3DDevice.EndScene Next ' レンダリング ターゲットをメイン バック バッファに戻す。 m_D3DDevice.SetRenderTarget BackBuffer, pZBuffer Set BackBuffer = Nothing Set Zbuffer = Nothing ' 元のトランスフォーム行列をリストアする。 m_D3DDevice.SetTransform D3DTS_VIEW, matViewSave m_D3DDevice.SetTransform D3DTS_PROJECTION, matProjSave End Sub
Direct3DDevice8.SetRenderTarget メソッドの呼び出しには注意すること。キューブ マップ サーフェスにレンダリングするときは、そのサーフェスをカレント レンダリング ターゲット サーフェスとして割り当てる必要がある。深度バッファを使用するアプリケーションでは、そのレンダリング ターゲットに明示的に深度バッファを作成したり、既存の深度バッファをレンダリング ターゲット サーフェスに再割り当てすることができる。上のコードでは、後者の方法を使用している。