Вершины позади рисуются перед - XNA - PullRequest
0 голосов
/ 29 ноября 2011

Что ж, я создаю майнкрафтский рельеф только для этого.У меня проблема в том, что если вы посмотрите под определенным углом, некоторые лица, которые на самом деле находятся позади других, нарисованы перед ними, таким образом, не показывая фактические лица, которые там находятся.Как и Minecraft, я делю ландшафт на регионы, и когда строится вершинный буфер, отображаются только «внешние» грани.Также по какой-то причине не рисуются ни самые верхние, ни левые блоки.В дополнение ко всем этим проблемам лица, кажется, перекрываются, т. Е. (Можно видеть только половину лица)

Вот как это выглядит (обратите внимание, я рисую только верхние грани, потому что мне нужно исправитьдругие вверх): http://s1100.photobucket.com/albums/g420/darestium/?action=view&current=minecraftliketerrain.png

Я также рисую все области за один раз, используя следующий метод (я использую файл эффектов Реймера, пока не смогу написать свой собственный):

public void Draw(Player player, World world) 
    { 
        effect.CurrentTechnique = effect.Techniques["TexturedNoShading"]; 
        effect.Parameters["xWorld"].SetValue(Matrix.Identity); 
        effect.Parameters["xProjection"].SetValue(player.Camera.ProjectionMatrix); 
        effect.Parameters["xView"].SetValue(player.Camera.ViewMatrix); 
        effect.Parameters["xCamPos"].SetValue(player.Camera.Position); 
        effect.Parameters["xTexture"].SetValue(world.TextureAlias.SheetTexture); 
        effect.Parameters["xCamUp"].SetValue(player.Camera.UpDownRotation); 

        for (int x = 0; x < world.regions.GetLength(0); x++) 
        { 
            for (int y = 0; y < world.regions.GetLength(1); y++) 
            { 
                foreach (EffectPass pass in effect.CurrentTechnique.Passes) 
                { 
                    pass.Apply(); 


                    Region region = world.regions[x, y]; 

                    if (player.Camera.BoundingFrustum.Contains(region.BoundingBox) != ContainmentType.Disjoint) 
                    { 
                        device.SetVertexBuffer(region.SolidVertexBuffer); 
                        //device.Indices = region.SolidIndices; 
                        device.DrawPrimitives(PrimitiveType.TriangleList, 0, region.VertexCount); 
                        //device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, region.VertexCount, 0, region.SolidIndices.IndexCount / 3); 
                    } 
                } 
            } 
        } 
    } 

Помощь будет высоко ценится спасибо:)

1 Ответ

0 голосов
/ 29 ноября 2011

Похоже, Z-буфер отключен. Попробуйте установить:

GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Проблема, связанная с отсутствием рисования верхних / левых блоков, о которой вы упомянули, вероятно, связана с вашим кодом генерации буфера вершин (если так, попробуйте задать другой вопрос конкретно об этой проблеме).

...