我对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()
时屏幕都会闪烁黑色。
答案 0 :(得分:1)
您需要将适当的渲染状态显式设置为适合您模型的任何颜色。将代码(在XNA中或其他方式)呈现为"在自身之后进行清理并不常见#34;以你期望的方式;这将是额外的费用,往往是不必要的。相反,它通常假设如果你需要在渲染之前以某种方式设置设备,那么你当时就自己这样做了,如果你没有明确地设置某些东西,那么你&< n> #39;很好,因为它是任意值。
当你说你的模特"呈现不正确时,很难确切地知道什么是错的,"但我建议您调查GraphicsDevice
上的以下属性:
MSDN文档指定了它们的默认值,因此您可以尝试显式重置它们。你不太可能需要重置所有这些;我的猜测基于你所写的SamplerStates
可能是罪魁祸首。了解每个人的所作所为,并尝试了解它可能如何影响您所看到的内容。
绝对不要拨打GraphicsDevice.Reset().
这样做太过分了,而不是为了这个目的。
答案 1 :(得分:0)
sampler Sampler = sampler_state
{
Texture = (Texture);
...
AddressU = Clamp;
AddressV = Clamp;
};
我的模型纹理应该换行,但正如您所看到的,着色器被设置为夹住纹理(这是我的纹理失真的来源)。粒子系统并不真正需要夹紧纹理,因此我将上述代码中的两个值都设置为Wrap
而不是Clamp
。这照顾了我的问题!