2

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

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

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

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

这是着色器处于活动状态的结果这就是它应该看起来的样子

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

4

1 回答 1

0

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

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

于 2017-05-10T03:34:17.440 回答