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 メソッドの呼び出しには注意すること。キューブ マップ サーフェスにレンダリングするときは、そのサーフェスをカレント レンダリング ターゲット サーフェスとして割り当てる必要がある。深度バッファを使用するアプリケーションでは、そのレンダリング ターゲットに明示的に深度バッファを作成したり、既存の深度バッファをレンダリング ターゲット サーフェスに再割り当てすることができる。上のコードでは、後者の方法を使用している。