0

我在尝试将多个 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;
4

1 回答 1

1

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

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

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

  • 在打开深度读取和写入的情况下绘制场景中的不透明对象。

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

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

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

于 2011-03-14T13:08:57.957 回答