所以,我正在尝试在 XNA 中制作游戏,并且我正在将像素着色器应用到我的关卡中,以便我可以向游戏屏幕添加效果。着色器本身运行良好,但它有一个缺陷确实会降低性能。只要着色器处于事件状态,我在屏幕上绘制的任何内容就好像是用最大的 alpha channel 绘制的一样。我使用 XNA 的内置 Color
类绘制了很多东西,其中大部分都有不同的 alpha。然而,着色器似乎忽略了所有这些。即使我只是从着色器返回源,也会发生这种情况。
我已经看到了一些可能的解决方案。第一个是绘制到 RenderTarget2D,虽然这确实解决了这个问题,但它导致了更严重的 alpha 问题,我什至不想深入探讨。
我看到一些人声称在着色器中将颜色乘以 alpha 值似乎有所帮助,但这绝对没有区别,这对我来说意味着 alpha 值输入始终被读取为 1。
这里有一些图片来说明我的问题:
希望有人知道如何解决这个问题。
最佳答案
在您的 Draw() 方法中,您需要调用:
GraphicsDevice.BlendState = BlendState.NonPremultiplied;
在调用任何调用着色器的方法(即 DrawUserIndexedPrimitives
等)之前。
否则,框架假定 alpha 值已被预乘,并且它可以直接将 RGB 值位 block 传输到帧缓冲区。
关于c# - 2D 像素着色器从颜色中移除 alpha channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10541172/