【问题标题】:XNA 4.0.4 use Z-buffer in rendertargetXNA 4.0.4 在 rendertarget 中使用 Z-buffer
【发布时间】:2014-11-11 22:42:52
【问题描述】:

我尝试在 rendertarget2d 中绘制我的 3d 世界。 如果我使用默认渲染目标,世界看起来很完美……但如果我渲染到渲染目标 2d,z 缓冲区将不起作用,并且背景中的对象将被绘制在其他人面前。

rendertarget2d 是正确的类吗? 我做错了什么?

public class Camera
{
    public Matrix View { get; set; }
    public Matrix Projection { get; set; }
    public RenderTarget2D RenderTarget { get; set; }
    public Vector2 Screen { get; set; }
    public Effect ZBufferEffect { get; set; }
    private GraphicsDevice device;


    public void Draw(SpriteBatch spriteBatch, Player player, SpriteFont font)
    {
        device.SetRenderTarget(RenderTarget);

        device.Clear(Color.Black);

        device.DepthStencilState = new DepthStencilState() { DepthBufferEnable = true };

        // Draw the scene



        View = Matrix.Invert(Object.OBJECTS[0].PosRotSca);
        View *= Matrix.CreateTranslation(0, -5, -5);
        View *= Matrix.CreateRotationX(MathHelper.ToRadians(20));
        foreach(Object obj in Object.OBJECTS)
        {               
            foreach(ModelMesh mesh in Game1.modelArray[obj.Model].Meshes)
            {
                //foreach (ModelMeshPart part in mesh.MeshParts)
                //{
                //    part.Effect = ZBufferEffect;
                //    ZBufferEffect.Parameters["World"].SetValue(obj.PosRotSca * mesh.ParentBone.Transform);
                //    ZBufferEffect.Parameters["View"].SetValue(View);
                //    ZBufferEffect.Parameters["Projection"].SetValue(Projection);
                //    ZBufferEffect.Parameters["ModelTexture"].SetValue(Game1.textureArray[obj.Texture]);
                //    ZBufferEffect.Parameters["invert"].SetValue(false);
                //}
                foreach (BasicEffect effect in mesh.Effects)
                {
                    effect.Texture = Game1.textureArray[obj.Texture];
                    effect.TextureEnabled = true;
                    effect.World = obj.PosRotSca;
                    effect.View = View;
                    effect.Projection = Projection;
                }
                mesh.Draw();
            }
        }
        device.SetRenderTarget(null);

        spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend,
            SamplerState.LinearClamp, DepthStencilState.Default,
            RasterizerState.CullNone);

        spriteBatch.Draw(RenderTarget, new Rectangle(0, 0, device.Viewport.Width, device.Viewport.Height), Color.White);

        spriteBatch.End();
    }


    public Camera(GraphicsDevice device)
    {

        RenderTarget2D rt = new RenderTarget2D(
            device,
            device.PresentationParameters.BackBufferWidth,
            device.PresentationParameters.BackBufferHeight,
            false,
            device.PresentationParameters.BackBufferFormat,
            DepthFormat.Depth24);

        RenderTarget = rt;


        this.device = device;

    }        

}

我可以更改渲染目标中的一些设置吗?还是我必须编写一个 Z 缓冲区着色器? 感谢您的帮助!

【问题讨论】:

    标签: c# xna-4.0 depth-buffer rendertarget


    【解决方案1】:

    由于我现在的机器上没有安装XNA,所以只能根据之前的经验推测。

    我看到了两个可能出错的地方。

    首先,SpriteBatch 更改了很多渲染状态,这些状态需要更改回用于 3D 渲染。在这里查看所有状态的概述:http://blogs.msdn.com/b/shawnhar/archive/2010/06/18/spritebatch-and-renderstates-in-xna-game-studio-4-0.aspx

    其次,但我认为这不是您的问题的原因, 尝试使用不同的清除重载清除渲染目标。

    GraphicsDevice.Clear 具有以下重载,您可以在其中指定要清除的深度值:

    public void Clear (
             ClearOptions options,
             Color color,
             float depth,
             int stencil
    )
    

    在此处阅读文档:http://msdn.microsoft.com/en-us/library/ff433734(v=xnagamestudio.40).aspx

    【讨论】:

    • ok 我在 draw 方法中添加了这些行: device.Clear(ClearOptions.Target, Color.Transparent, 0.0f, 0); // 绘制场景 device.BlendState = BlendState.Opaque; device.DepthStencilState = DepthStencilState.Default;但一切都没有改变
    • 嘿它工作...这是我的错,我使用了另一个未定义的渲染目标:(但现在它工作正常!非常感谢
    猜你喜欢
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    相关资源
    最近更新 更多