0

ここ数日、私たちはボクセル エンジンに取り組みました。立方体を描画すると、深度レンダリングの問題が発生します。次の Youtube ビデオを参照してください: http://youtu.be/lNDAqO7yHBQ

すでにこの問題に沿って検索し、さまざまなアプローチを見つけましたが、どれも問題を解決しませんでした。

  • GraphicsDevice.Clear(ClearOptions.DepthBuffer | ClearOptions.Target, Color.CornflowerBlue, 1.0f, 0);
  • GraphicsDevice.BlendState = BlendState.Opaque;
  • GraphicsDevice.DepthStencilState = DepthStencilState.Default;
  • GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

私たちのLoadContent()方法:

protected override void LoadContent()
{
    // Create a new SpriteBatch, which can be used to draw textures.
    _spriteBatch = new SpriteBatch(GraphicsDevice);

    // TODO: use this.Content to load your game content here
    _effect = new BasicEffect(GraphicsDevice);

    _vertexBuffer = new VertexBuffer(GraphicsDevice, Node.VertexPositionColorNormal.VertexDeclaration, _chunkManager.Vertices.Length, BufferUsage.WriteOnly);
    _vertexBuffer.SetData(_chunkManager.Vertices); // copies the data from our local vertices array into the memory on our graphics card

    _indexBuffer = new IndexBuffer(GraphicsDevice, typeof(int), _chunkManager.Indices.Length, BufferUsage.WriteOnly);
    _indexBuffer.SetData(_chunkManager.Indices);
}

私たちのDraw()方法:

protected override void Draw(GameTime gameTime)
{
    GraphicsDevice.Clear(Color.CornflowerBlue);

    GraphicsDevice.BlendState = BlendState.Opaque;
    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
    GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;

    // Set object and camera info
    //_effect.World = Matrix.Identity;
    _effect.View = _camera.View;
    _effect.Projection = _camera.Projection;
    _effect.VertexColorEnabled = true;
    _effect.EnableDefaultLighting();

    // Begin effect and draw for each pass
    foreach (var pass in _effect.CurrentTechnique.Passes)
    {
        pass.Apply();

        GraphicsDevice.SetVertexBuffer(_vertexBuffer);
        GraphicsDevice.Indices = _indexBuffer;

        GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, _chunkManager.Vertices.Count(), 0, _chunkManager.Indices.Count() / 3);
    }

    base.Draw(gameTime);
}

ビューと投影のセットアップ:

Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, (float)Game.Window.ClientBounds.Width / Game.Window.ClientBounds.Height, 1, 500);
View = Matrix.CreateLookAt(CameraPosition, CameraPosition + _cameraDirection, _cameraUp);

Aaron Reed の本 ( http://shop.oreilly.com/product/0636920013709.do )の Camera ( http://www.filedropper.com/camera_1 ) を使用します。

私たちが見逃した何かを見ましたか?または、この問題を解決するアイデアはありますか?

4

2 に答える 2

0

はい、ゲーム、特にフライトや宇宙シミュレーションなどの大規模な世界シミュレーションではよく知られている問題です。基本的に、カメラが原点から離れすぎると、浮動小数点の不正確さが発生し、特に回転中に大混乱を引き起こします。

解決策は、目を動かす代わりに本質的に宇宙を動かすフローティングオリジンとして知られる方法です。この記事はUnity3D向けですが、.netなのでXNAに変換できます。詳細については、こちらの優れた記事をご覧ください。

また、非常に近いものと非常に遠いものを同時に表示しながら、Z バッファ内の有限数のビットに絞り込めるものは限られています。そのためには、1:1 の代わりに対数 z バッファーを使用する必要があります。もっと知りたい?

ここで宇宙シミュレーションに取り組んでいたとき、私はそれについてブログに書きました。

于 2014-10-12T16:03:42.290 に答える
0

今日、私たちはこのトピックに取り組みました。元のコードのボクセルの座標はおよそ (X:600'000、Y:750、Z:196'000) でした。すべてのボクセルをゼロ ポイント (X:0、Y:0、Z:0) に近づけた後、説明した問題はなくなりました。これは、XNA で使用される datatyp float と関係があると想定しています。MSDN (http://msdn.microsoft.com/en-us/library/b1e65aza.aspx) によると、float の精度は 7 桁のみです。ボクセルを 7 桁の精度で座標に配置すると、XNA の DepthBuffer が float で動作するため、上記の効果が得られると結論付けました。

誰かが私たちの仮定を確認できますか?

ありがとうございました!

于 2012-10-03T14:08:24.790 に答える