如何在XNA中恢复默认着色器?

时间:2014-03-25 16:16:31

标签: 3d xna shader xna-4.0

我对XNA有些新意,并且正在使用BEPU物理创建3D游戏(这是大学课程所必需的)。我正在尝试从Microsoft的粒子示例中实现一个简单的粒子系统。在粒子的Draw()方法中,执行以下代码:

// Activate the particle effect.
foreach (EffectPass pass in particleEffect.CurrentTechnique.Passes)
{
    pass.Apply();

    //Draw particle primitives
    ...

}

CurrentTechnique.Passes中有一个标题为P0的过程,它对应于粒子效果FX文件中的以下过程:

// Effect technique for drawing particles.
technique Particles
{
    pass P0
    {
        VertexShader = compile vs_2_0 ParticleVertexShader();
        PixelShader = compile ps_2_0 ParticlePixelShader();
    }
}

然而,这个操作导致我的一些模型的UV贴图不正确地渲染,除了我用于粒子系统的那些之外,我没有使用任何自定义着色器。是否有可能有效地撤消应用此过程的效果以绘制我的其他模型?我可以在游戏的主GraphicsDevice.Reset()循环开始时调用Draw(),这可以解决问题,但在全屏模式下,每次调用GraphicsDevice.Reset()时屏幕都会闪烁黑色。

2 个答案:

答案 0 :(得分:1)

您需要将适当的渲染状态显式设置为适合您模型的任何颜色。将代码(在XNA中或其他方式)呈现为"在自身之后进行清理并不常见#34;以你期望的方式;这将是额外的费用,往往是不必要的。相反,它通常假设如果你需要在渲染之前以某种方式设置设备,那么你当时就自己这样做了,如果你没有明确地设置某些东西,那么你&< n> #39;很好,因为它是任意值。

当你说你的模特"呈现不正确时,很难确切地知道什么是错的,"但我建议您调查GraphicsDevice上的以下属性:

MSDN文档指定了它们的默认值,因此您可以尝试显式重置它们。你不太可能需要重置所有这些;我的猜测基于你所写的SamplerStates可能是罪魁祸首。了解每个人的所作所为,并尝试了解它可能如何影响您所看到的内容。

绝对不要拨打GraphicsDevice.Reset().这样做太过分了,而不是为了这个目的。

答案 1 :(得分:0)

科尔坎贝尔对我的问题的回答肯定有助于解决一些着色器问题,所以如果你遇到类似的问题,一定要看看。但是,当我在FX文件中找到以下Sampler代码时,我解决了我的问题:

sampler Sampler = sampler_state
{
    Texture = (Texture);    

    ...

    AddressU = Clamp;
    AddressV = Clamp;
};

我的模型纹理应该换行,但正如您所看到的,着色器被设置为夹住纹理(这是我的纹理失真的来源)。粒子系统并不真正需要夹紧纹理,因此我将上述代码中的两个值都设置为Wrap而不是Clamp。这照顾了我的问题!