1

我正在创建一个我的世界克隆,每当我稍微快一点移动相机时,块之间就会出现很大的撕裂,如下所示:

http://imgur.com/oTtN2

每个块都是 32x32x32 立方体,并且每种立方体都有一个顶点缓冲区,以防万一。我也在屏幕上绘制 2D 文本,我了解到我必须为每种绘图设置图形设备状态。这是我绘制立方体的方式:

GraphicsDevice.Clear(Color.LightSkyBlue);

#region 3D
// Set the device
device.BlendState = BlendState.Opaque;
device.DepthStencilState = DepthStencilState.Default;
device.RasterizerState = RasterizerState.CullCounterClockwise;

// Go through each shader and draw the cubes of that style
lock (GeneratedChunks)
{
    foreach (KeyValuePair<CubeType, BasicEffect> KVP in CubeType_Effect)
    {
        // Iterate through each technique in this effect
        foreach (EffectPass pass in KVP.Value.CurrentTechnique.Passes)
        {
            // Go through each chunk in our chunk map, and pluck out the cubetype we care about
            foreach (Vector3 ChunkKey in GeneratedChunks)
            {
                if (ChunkMap[ChunkKey].CubeType_TriangleCounts[KVP.Key] > 0)
                {
                    pass.Apply(); // assign it to the video card
                    KVP.Value.View = camera.ViewMatrix;
                    KVP.Value.Projection = camera.ProjectionMatrix;
                    KVP.Value.World = worldMatrix;

                    device.SetVertexBuffer(ChunkMap[ChunkKey].CubeType_VertexBuffers[KVP.Key]);
                    device.DrawPrimitives(PrimitiveType.TriangleList, 0, ChunkMap[ChunkKey].CubeType_TriangleCounts[KVP.Key]);
                }
            }
        }
    }
}
#endregion

如果我站着不动,世界看起来还不错。我认为这可能是因为我处于窗口模式,但是当我切换全屏时问题仍然存在。我还假设 XNA 本身是双缓冲的?或者谷歌告诉我的。

4

2 回答 2

1

我有一个类似的问题 - 我发现我必须在设置所有效果的参数后调用 pass.Apply() ......

于 2012-02-24T05:03:16.597 回答
0

到目前为止的修复是使用 1 个巨大的顶点缓冲区。我不喜欢它,但这似乎是所有的工作。

于 2012-02-16T22:19:40.323 回答