【问题标题】:2D Pixel Shader removing alpha channel from color2D Pixel Shader 从颜色中移除 Alpha 通道
【发布时间】:2012-05-10 19:52:02
【问题描述】:

所以,我正在尝试在 XNA 中制作游戏,并且我正在将像素着色器应用到我的关卡,以便我可以在游戏画面中添加效果。着色器本身运行良好,但它有一个缺陷确实会降低性能。只要着色器处于活动状态,我在屏幕上绘制的任何内容就好像它是以最大 Alpha 通道绘制的一样。我使用 XNA 内置的 Color 类绘制了很多东西,其中大部分都有不同的 alpha。然而,着色器似乎忽略了所有这些。即使我只是从着色器返回源,也会发生这种情况。

我已经看到了一些可能的解决方案。其中第一个是绘制到 RenderTarget2D,虽然这确实解决了这个问题,但它导致了更严重的 alpha 问题,我什至不想进入。

我看到一些人声称将颜色乘以着色器中的 alpha 值似乎有帮助,但这完全没有区别,这对我来说表明 alpha 值输入总是被读取为 1。

这里有一些图片来说明我的问题:

希望有人知道如何解决这个问题。

【问题讨论】:

  • 我做了更多的测试。似乎 XNA 的 SpriteBatch.Draw 方法中对颜色的任何更改都已删除,从而使所有纹理都使用“Color.White”进行绘制。这对我来说很成问题。
  • 是的,如果您的像素着色器忽略了 alpha 值,或者没有传递它,那么您在使用该着色器时会看到这种效果。发布您的着色器代码。
  • 在发现它忽略了所有的色调效果,而不仅仅是 alpha 之后,我进行了稍微不同的搜索,并找到了我的解决方案。我会把这个留在这里,以防有人遇到同样的问题。我找到的解决方案在这里:forums.create.msdn.com/forums/t/35420.aspx 它使用 SpriteBatch 颜色参数并简单地将输入乘以它,从而为您提供所需的色调。感谢您尝试提供帮助。作为记录,我的着色器中几乎没有代码。它接受了一个颜色参数并返回它。
  • 是的,我的意思是,我已经明确尝试返回 Alpha 为 0 的颜色,但它仍然将像素放在屏幕上。 -- 什么鬼?

标签: c# xna shader alpha hlsl


【解决方案1】:

在您的 Draw() 方法中,您需要调用: GraphicsDevice.BlendState = BlendState.NonPremultiplied; 在调用任何调用着色器的方法之前(即DrawUserIndexedPrimitives 等)。

否则,框架假定 alpha 值已被预乘,并且它可以将 RGB 值直接传送到帧缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-11
    • 2021-10-02
    • 2013-07-05
    • 2011-12-06
    • 2014-08-26
    • 2015-02-03
    • 1970-01-01
    • 2014-02-20
    相关资源
    最近更新 更多