XNA渲染多个Alpha问题

时间:2011-03-14 12:30:56

标签: c# xna alpha blending

我遇到了尝试在彼此顶部渲染多个alpha对象的问题。目前,如果我在另一个alpha对象的顶部渲染一个alpha对象,则显示顶部alpha对象,但直到你越过/围绕第一个对象才会显示底部对象。我正在尝试获得一种加性混合效果,因此顶部对象显示其后面还有另一个透明对象。你在XNA怎么做? 我当前的渲染状态设置为:

RenderState rs = Globals.g_Device.RenderState;
rs.AlphaBlendEnable = true;
rs.BlendFunction = BlendFunction.Add;
rs.DepthBufferFunction = CompareFunction.LessEqual;
rs.DepthBufferEnable = true;
rs.DepthBufferWriteEnable = true;
Globals.g_Device.PresentationParameters.EnableAutoDepthStencil = true;
Globals.g_Device.PresentationParameters.AutoDepthStencilFormat =     DepthFormat.Depth24Stencil8;

1 个答案:

答案 0 :(得分:1)

深度缓冲区使得渲染对象的顺序无关紧要。如果您在已经绘制的内部“下方”绘制像素,则会跳过它。如果您在屏幕上方绘制一个“上方”像素,则会绘制并覆盖屏幕内容(以及深度缓冲区,它提供正确的深度以与下一个绘制的三角形进行比较)。

不幸的是,这对透明对象不起作用。如果在场景顶部绘制透明对象,它将混合与可见场景。但是没有办法融合深度,所以它只是覆盖它。所以,当你去另一个“透明”的对象下面时,它会被正常跳过。

以下是渲染包含透明对象的场景的一般过程:

  • 在场景中绘制不透明对象,并打开深度读写。

  • 从后到前排序透明对象。

  • 在打开深度读数的情况下绘制已排序的透明对象。

执行此操作时,透明对象将被不透明对象正确遮挡。但是,因为它们被正确排序,透明对象将没有机会遮掩尚未绘制的其他透明对象。