【问题标题】:Custom BlendState to avoid AlphaBlending artifacts自定义 BlendState 以避免 AlphaBlending 伪影
【发布时间】:2012-04-13 17:10:44
【问题描述】:

我本质上是在每一帧都在自己身上绘制一个纹理,每次我绘制它时我都想减少 alpha 以便它最终达到 0,这样就不会留下任何伪影。

基本方程是:

result = (source * sourceBlendFactor) blendFunction (destination * destinationBlendFactor)

由于我的目的地是 Color.Transparent,我认为我需要:

result = 0 = (source * sourceBlendFactor); 

我绞尽脑汁研究不同的 BlendState 组件,但我似乎无法实现这一点......

有没有办法让 alpha 线性递减?

【问题讨论】:

  • 请不要在标题前加上“C# XNA”之类的前缀。这就是标签的用途。
  • 当您在我们选择的编辑器中查看资产时,工件是否存在?如果是这样,请在此处修复它们,如果不修复您设置的渲染选项以防止工件发生。你所做的就是用你的想法强迫任何部分透明的像素变得完全透明。换句话说,我非常确定你试图解决你的问题的症状没有来源。
  • 另外你如何导入你的资产这听起来像你的资产没有预乘并且你在你的 Spritebatch 中使用一个 Blendstate 假设 Texture2D 是预乘的。

标签: c# colors xna draw alphablending


【解决方案1】:

当然可以。定义一个值,将当前 alpha 状态保持在 1 和 0 之间。每帧递减该值,直到达到 0。在 draw 方法中,您确定 tint 颜色的 alpha 值。

byte alpha = 255 - (currentAlphaState * 255);
spriteBatch.Draw(...., new Color( 255, 255, 255, alpha) ...); // assuming white is your default tint color

【讨论】:

  • 有没有办法从 RenderTarget2D 对象中获取当前的 alpha 状态?我基本上连续渲染到一个持久的 RenderTarget2D 类,其中旧图像比新图像更透明。我基本上希望它能够将像素 alpha 值减少到 0。
  • Rendertarget2D 没有“当前”alpha 状态。纹理可以包含 alpha 像素,但这无关紧要。您可以将数据存储在类的 Tag 成员中,但您真正应该查看的是封装了 RenderTarget2D 的 Drawable 游戏组件,该组件存储 alpha 混合状态并更新其值。
  • 你也可以这样做.... spriteBatch.Draw(...., Color.White * currentAlphaState,...);
猜你喜欢
  • 2023-04-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
相关资源
最近更新 更多