2

为此搜索了很多,阅读了这篇非常有用的文章,但仍然想知道我的项目的解决方案。此屏幕截图完美地说明了我的问题:

Alpha 混合问题

有 2 个对象:红色对象由 2 个四边形组成,一个 z-index 为 -1,另一个 z-index 为 1。两个四边形都有Color.Red * 0.5f. 首先被绘制。另一个对象是 z-index 为 0 的玩家。第二个被绘制

因为我希望玩家在四边形之间移动,所以我设置DepthStencilState了, DepthStencilState.Default;但这提供了以下图像。玩家的像素会被忽略,因为它前面有一个物体。

我基于这个类将我所有的图元批处理到一个大的 DrawUserPrimitive 中。这个问题的最佳解决方案是什么?我是否必须根据 z-index 对三角形进行排序(我该怎么做;它很贵吗?)还是有其他解决方案?

4

1 回答 1

3

你只需要完全按照那篇文章所说的去做。以下是针对 XNA 4 更新的“最常用方法”的说明:

  1. GraphicsDevice.DepthStencilState = DepthStencilState.Default
  2. 绘制所有不透明的几何体
  3. GraphicsDevice.DepthStencilState = DepthStencilState.DepthRead
  4. 按与相机的距离对 alpha 混合对象进行排序,然后按从后到前的顺序绘制它们

如果您的透明对象或多或少是凸的,那么您不需要对三角形进行排序 - 只需对对象本身进行排序 - 只要您使用RasterizerState.CullCounterClockwise(即:背面剔除,默认设置)。

您必须这样做的原因是深度缓冲区只能存储一个值 - 即最顶部像素的值。没有在该深度“下”绘制的概念。执行此操作所需的数据(在该像素的 Z 索引上方和下方绘制的对象的颜色)已经混合到最终图像中,无法提取。

于 2013-03-06T14:29:52.907 回答