C# XNA渲染多个Alpha问题

C# XNA渲染多个Alpha问题,c#,xna,alpha,blending,C#,Xna,Alpha,Blending,我在尝试渲染多个alpha对象时遇到了一个问题。此时,如果我在另一个alpha对象的顶部渲染一个alpha对象,则会显示顶部alpha对象,但底部对象在经过/绕过第一个对象之前不会显示。我试图得到一个加法混合效果,所以顶部的对象显示它后面有另一个透明对象。您在XNA中是如何做到这一点的?? 我的当前渲染状态设置为: RenderState rs = Globals.g_Device.RenderState; rs.AlphaBlendEnable = true; rs.BlendFunction

我在尝试渲染多个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;

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

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

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

  • 在启用深度读取和写入的情况下,在场景中绘制不透明对象

  • 将透明对象从后向前排序

  • 在启用深度读取的情况下绘制已排序的透明对象

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