2

XNA 4.0 上关于深度问题的大头疼:

在此处输入图像描述


我已经找到了许多类似问题的答案,但没有一个适合我......

设备设置如下:

xnaPanel1.Device.BlendState = BlendState.Opaque;                
xnaPanel1.Device.DepthStencilState = DepthStencilState.Default;
xnaPanel1.Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8;
[...]
Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 4.0f / 3.0f, 0.1f, 1000f);

作为一个残酷的问题解决者,我尝试了大多数 DepthStencilFormat 和 DepthStencilState 的可能性......没有人像我想要的那样工作。

关于投影矩阵,我也尝试了许多近剪辑和远剪辑值。(立方体宽度:10f)但无法得到正确的结果。

我已经用许多不同的纹理对此进行了测试,所有这些都是不透明的。

我不使用BasicEffect,而是使用纹理+法线贴图的效果,这可能是问题的根源吗?

CubeEffect.fx

[...]
sampler2D colorMap = sampler_state
{
Texture = <colorMapTexture>;
    MagFilter = Linear;
    MinFilter = Anisotropic;
    MipFilter = Linear;
    MaxAnisotropy = 16;
};
sampler2D normalMap = sampler_state
{
   Texture = <normalMapTexture>;
   MagFilter = Linear;
   MinFilter = Anisotropic;
   MipFilter = Linear;
   MaxAnisotropy = 16;
};
[...]

编辑:我尝试了 BasicEffect 并且问题是一样的......

所以...感谢您的帮助;)

4

3 回答 3

2

好的,就是这样。

pp.DepthStencilFormat = DepthFormat.Depth24Stencil8;

必须在设备创建调用之前

所以我现在不知道为什么会这样:

Device.PresentationParameters.DepthStencilFormat = DepthFormat.Depth24Stencil8;

以前在我的主要绘图函数中调用,不起作用......

结论?

PresentationParameters pp = new PresentationParameters();
pp.IsFullScreen = false;
pp.BackBufferHeight = this.renderControl.Height;
pp.BackBufferWidth = this.renderControl.Width;
pp.DeviceWindowHandle = renderControl.Handle;
pp.DepthStencilFormat = DepthFormat.Depth24Stencil8;
this.graphicsDevice = new GraphicsDevice(GraphicsAdapter.DefaultAdapter, GraphicsProfile.HiDef, pp);

现在工作正常!

于 2012-09-15T01:01:24.773 回答
1

PresentationParameters 是一个定义如何创建设备的结构。您已经看到,当您创建图形设备时,您需要传入结构,该结构仅用于初始配置。

设备将演示参数存储在其上,但除非您在设备上调用重置,否则更改它不会执行任何操作,这将重新初始化设备以使用您更改的任何参数。这是一项昂贵的操作(因此您不想经常这样做)。

于 2012-09-15T04:28:27.560 回答
0

基本上GraphicsDevice.PresentationParameters是一个输出——写入它实际上并不会改变设备状态。每当设置或重置设备时,它都会更新。

通常,您将设置GraphicsDevice使用GraphicsDeviceManager- 它为您处理设置、重置和拆卸设备。它是默认 XNA 游戏模板项目的一部分。

修改状态的正确方法是在GraphicsDeviceManager. 在您的情况下,您可以简单地设置PreferredDepthStencilFormat.

完成此操作后,您需要设置设备(即:在游戏构造函数中指定您的设置,然后 XNA 将完成其余工作),或者通过调用重置GraphicsDeviceManager.ApplyChanges设备- 您通常应该只在响应用户输入时执行此操作(显然不是每一帧)。有关详细信息,请参阅此答案


您会注意到有些演示参数不能直接在GraphicsDeviceManager. 要更改这些,您必须将事件处理程序附加到 GraphicsDeviceManager.PreparingDeviceSettings. 事件参数将让您访问可以有效修改的演示参数版本 ( e.GraphicsDeviceInformation.PresentationParameters) - 其中的设置是创建图形设备时使用的设置。

于 2012-09-15T07:26:22.173 回答