2011-10-19 5 views
1

背景:私は高さフィールドをレンダリングするためにGPUレイキャスティングを使用するタイルベースの地形レンダラーを作成しています。私のグラフィックスコーディングはC++/OpenGLでしたが、C#/ XNA4(すなわちDirectX9)を少しの学習経験として試してみることにしました。XNA4 DrawUserIndexedPrimitivesで使用されている頂点のセットが正しくありません。

問題:DrawUserIndexedPrimitivesへの呼び出しは、以前の呼び出しで指定された頂点配列を使用しているように見えます。

詳細: タイルレンダラは、タイルの境界ボックスの背面をラスタライズして動作します。ピクセルシェーダはレイキャスティングを実行します。

private void RenderTile(GraphicsDevice device) 
{ 
    device.DrawUserIndexedPrimitives(
     PrimitiveType.TriangleList, 
     this.BoundingBoxVertex, 0, 8, 
     this.BoundingBoxIndex, 0, 12); 
} 

とバウンディングボックスのワイヤーフレームをレンダリングする:ボックスを描画するための呼び出しはこれです

この生成
private void RenderBoundingBox(GraphicsDevice d) 
{ 
    d.DrawUserIndexedPrimitives(
     PrimitiveType.LineList, 
     this.BoundingBoxRenderVertex, 0, 8, // vertex format is different here, 
              // but the positions are the same. 
     this.BoundingBoxRenderIndex, 0, 12); 
} 

:私たちは、それ自体で別のタイルを使用している場合 screenshot of correct tile render

を(全地形は2×2タイルです):

screenshot of correct tile render

012私たちは一緒に両方をレンダリングする場合

ただし、バウンディングボックスは、転置されています

Two tiles - incorrect render

私は私が前にレンダリングされたタイルをもたらしたXNAコードでの基本的なミスを犯してきたと仮定していますタイルの頂点ですが、見つけられません。

同じセットのデータ(float[])は、高さマップテクスチャと境界ボックスを作成するために使用されるため、境界ボックスの作成ではエラーには見えません。

答えて

1

OK、問題が見つかりました。私はレンダリングパス内エフェクトのパラメーターを設定した(そうはい、基本的な間違い)

オリジナルコード:固定

foreach (var pass in effect.CurrentTechnique.Passes) 
    { 
     pass.Apply(); 
     effect.Parameters["HeightTex"].SetValue(this.HeightTex); 
     effect.Parameters["Eye"].SetValue(eyePosTile); 
     effect.Parameters["World"].SetValue(this.TileMatrix); 
     effect.Parameters["View"].SetValue(viewMatrix); 
     effect.Parameters["TexToView"].SetValue(texToViewMatrix); 
     effect.Parameters["Projection"].SetValue(projectionMatrix); 
     effect.Parameters["LightDir"].SetValue(lightDirection); 
     this.RenderTile(device); 
    } 

effect.Parameters["HeightTex"].SetValue(this.HeightTex); 
    effect.Parameters["Eye"].SetValue(eyePosTile); 
    effect.Parameters["World"].SetValue(this.TileMatrix); 
    effect.Parameters["View"].SetValue(viewMatrix); 
    effect.Parameters["TexToView"].SetValue(texToViewMatrix); 
    effect.Parameters["Projection"].SetValue(projectionMatrix); 
    effect.Parameters["LightDir"].SetValue(lightDirection); 

    foreach (var pass in effect.CurrentTechnique.Passes) 
    { 
     pass.Apply(); 
     this.RenderTile(device); 
    } 

enter image description here

関連する問題