【问题标题】:XNA Render Multiple Alpha IssueXNA 渲染多个 Alpha 问题
【发布时间】:2011-03-14 12:30:56
【问题描述】:

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

【问题讨论】:

    标签: c# xna alpha blending


    【解决方案1】:

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

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

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

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

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

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

    当你这样做时,你的透明对象将被不透明的对象正确地遮挡。但是,由于它们已正确排序,透明对象不会有机会遮挡其他尚未绘制的透明对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多