【问题标题】:XNA Depth Map Overlapping Areas ColorXNA 深度图重叠区域颜色
【发布时间】:2012-02-28 18:48:26
【问题描述】:

我正在尝试绘制场景的深度图。 现在,我制作了一个 HLSL 文件,如下所示:http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Shadow_map.php 一切都很顺利。然而!我想找出每个像素的确切值,所以我没有在正常的渲染目标上绘图,而是创建了一个新的渲染目标,它是一个 Texture2D,如:http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series3/Render_to_texture.php 然后我使用 spritebatch 绘制它。

那么!当我显示图像时,第一个,即直接绘制到屏幕上的那个会给出这个输出:

然后使用精灵绘制到纹理然后绘制到屏幕的那个给出了这个:

请注意,在第二次捕获中,身体的右臂(明显在身体后面)被绘制成好像身体不存在于重叠区域中一样。

我认为这是一个排序问题,因为前面的顶点首先被绘制到纹理上,然后越远的顶点覆盖越近的顶点,从而产生观察到的图像。

如有任何意见,我将不胜感激。

【问题讨论】:

    标签: xna xna-4.0 hlsl depth


    【解决方案1】:

    SpriteBatchmodifies the graphics device state 当你使用它时。从链接的文章中,它的设置如下:

    GraphicsDevice.BlendState = BlendState.AlphaBlend;
    GraphicsDevice.DepthStencilState = DepthStencilState.None;
    GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
    GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp;
    

    您可能希望将深度模板状态设置回默认值(深度读取和写入)。

    GraphicsDevice.DepthStencilState = DepthStencilState.Default;
    

    您可能还需要设置一些其他状态,具体取决于您的渲染需要。

    【讨论】:

    • +1:完全同意。在这种情况下,我通常会在SpriteBatch.Begin()调用之前放置一个断点并检查DepthStencilStateBlendStateRasterizerState,然后在SpriteBatch.End()调用之后将它们全部重置。
    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2016-08-21
    • 2013-09-27
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多