次の方法で共有


ProgressiveMesh.Clone

Clone メソッド

使用例

  • プログレッシブ メッシュのトリミングと最適化

オブジェクトを複製する。

オーバーロード リスト

public ProgressiveMesh Clone (MeshFlags, GraphicsStream, Device)
public ProgressiveMesh Clone (MeshFlags, VertexElement[], Device)
public ProgressiveMesh Clone (MeshFlags, VertexFormats, Device)

使用例

プログレッシブ メッシュのトリミングと最適化

この例では、詳細レベル (LOD) の最小値と最大値を変更することで、プログレッシブ メッシュをトリミングおよび最適化する方法を示す。ここでは ProgressiveMesh.TrimByVertices メソッドを使う。プログレッシブ メッシュとは、頂点情報を特殊なデータ ツリーとして内部的に格納するメッシュのことで、この情報にアクセスして任意の数の頂点を持つメッシュをレンダリングできる。

次のサンプル コードでは、10 次元配列のプログレッシブ メッシュを作成し、それぞれについて TrimByVertices メソッドと OptimizeBaseLevelOfDetail メソッドを使って、LOD の最小値と最大値を目的の値に設定している。TrimByVertices は各プログレッシブ メッシュのダイナミック レンジを小さくし、OptimizeBaseLevelOfDetail はメッシュの面と頂点を並べ替えてパフォーマンスを最適化する。結果として生成されるプログレッシブ メッシュの配列を使えば、同じオリジナル メッシュを 10 個の異なる LOD でレンダリングできる。

次の 2 つの MeshFlags 定数は、メッシュのコピー処理において設定される。

  • Managed: Pool.Managed メモリを使う。
  • VbShare: コピーされたメッシュが頂点バッファを共有するように強制する。
using Microsoft.DirectX.Direct3D;

protected Device device; // The rendering device
device = null;
Mesh pMesh = null;
Mesh pTempMesh = null;
ProgressiveMesh pPMesh = null;
ProgressiveMesh[] pmeshes = null;
GraphicsStream adj = null;

int cVerticesMin = 0;
int cVerticesMax = 0;
int cVerticesPerMesh = 0;

// Load pMesh from a file, and process as required
.
.
.
// Initialize a progressive mesh based upon original pMesh
pPMesh = new ProgressiveMesh(pMesh, adj, null, 1, MeshFlags.SimplifyVertex);

// Initialize minimum and maximum number of vertices, and step value
cVerticesMin = pPMesh.MinVertices;
cVerticesMax = pPMesh.MaxVertices;
cVerticesPerMesh = (cVerticesMax - cVerticesMin) / 10;  // See next step

// Initialize a new 10-member progressive mesh array
pmeshes = new ProgressiveMesh[(int)Math.Max(1,
    Math.Ceiling((cVerticesMax - cVerticesMin) / (float)cVerticesPerMesh))];

// Clone all the separate pmeshes
for (int iPMesh = 0; iPMesh < pmeshes.Length; iPMesh++)
{
    pmeshes[iPMesh] = pPMesh.Clone( MeshFlags.Managed | MeshFlags.VbShare,
                                    pPMesh.VertexFormat,
                                    device);

    // trim to appropriate space
    pmeshes[iPMesh].TrimByVertices(
                               cVerticesMin + cVerticesPerMesh * iPMesh,
                               cVerticesMin + cVerticesPerMesh * (iPMesh+1));
    pmeshes[iPMesh].OptimizeBaseLevelOfDetail(MeshFlags.OptimizeVertexCache);
}

© 2002 Microsoft Corporation. All rights reserved. Terms of use.