Platform SDK: DirectX

頂点バッファ レンダリングについて

アプリケーションが頂点を頂点バッファからレンダリングする一般的なステートは 2 つある。最も基本的なレベルで、2 つのステートは、「レンダリング時」に頂点バッファ内にある頂点の種類によって分けられる。しかし、間接的には、アプリケーションの使用する手順が、いつ頂点操作とレンダリング操作を実行するかを決定する。アプリケーションで頂点バッファからレンダリングする場合は、頂点バッファ メソッドを使用する必要がある。次の図表で、未トランスフォーム頂点バッファからのレンダリング処理を説明する。

[C++]

上の図に示すように、IDirect3DDevice7::DrawPrimitiveVB および IDirect3DDevice7::DrawIndexedPrimitiveVB メソッドでは、未トランスフォームの頂点バッファからのレンダリングを実行できる。この場合、レンダリング メソッドを呼び出すたびに、システムは頂点操作とレンダリング操作を行う。この方法を使用しても、従来の DrawPrimitive レンダリング メソッドよりも優れたパフォーマンスが得られるわけではないが、場合によっては便利なときもある。次の図に示すように、可能であればトランスフォームされた頂点データを再使用して、パフォーマンスを最適化できる。

[Visual Basic]

上の図に示すように、Visual Basic の Direct3DDevice7.DrawPrimitiveVB および Direct3DDevice7.DrawIndexedPrimitiveVB メソッドでは、未トランスフォームの頂点バッファからのレンダリングを実行できる。この場合、レンダリング メソッドを呼び出すたびに、システムは頂点操作とレンダリング操作を行う。この方法を使用しても、従来の DrawPrimitive レンダリング メソッドよりも優れたパフォーマンスが得られるわけではないが、場合によっては便利なときもある。次の図に示すように、可能であればトランスフォームされた頂点データを再使用して、パフォーマンスを最適化できる。

[C++]

この場合、アプリケーションは 2 つの頂点バッファを作成する。1 つは未トランスフォームのジオメトリ用で、もう 1 つはトランスフォームされたジオメトリ用である。IDirect3DVertexBuffer7::ProcessVertices が呼び出されたとき、第 2 バッファはトランスフォーム済み頂点データを取得する。ProcessVertices メソッドは、転送元バッファ内の頂点を読み出し、要求された頂点操作を行い、結果を転送先バッファに入れる。未トランスフォームの頂点をレンダリングするように、トランスフォームされた頂点に対して同じレンダリング メソッドを呼び出すことができる。ただし、未トランスフォームの頂点と異なり、Direct3D は頂点バッファ内のデータがトランスフォームされていることを自動的に検出して、直ちにラスタライズされるよう転送する。不必要なトランスフォームを省略して、パフォーマンスのオーバーヘッドは最小に保たれる。

 :  IDirect3DVertexBuffer7 インターフェイスは、新しいメソッドとして IDirect3DVertexBuffer7::ProcessVerticesStrided を提供する。このメソッドは、ストライド頂点を転送先頂点バッファに処理する。

[Visual Basic]

この場合、アプリケーションは 2 つの頂点バッファを作成する。1 つは未トランスフォームのジオメトリ用で、もう 1 つはトランスフォームされたジオメトリ用である。Direct3DVertexBuffer7.ProcessVertices が呼び出されたとき、第 2 バッファはトランスフォーム済み頂点データを受け取る。ProcessVertices メソッドは、転送元バッファ内の頂点を読み出し、要求された頂点操作を行い、結果を転送先バッファに入れる。未トランスフォームの頂点をレンダリングするように、変換された頂点に対して同じレンダリング メソッドを呼び出すことができる。ただし、未変換の頂点と異なり、Direct3D は頂点バッファ内のデータがトランスフォームされていることを自動的に検出して、直ちにラスタライズされるよう転送する。不必要なトランスフォームを省略して、パフォーマンスのオーバーヘッドは最小に保たれる。

頂点バッファの内容を最適化すると、パフォーマンスをさらに向上できる。詳細については、「頂点バッファの最適化」を参照すること。