所以,我正在尝试在XNA中制作游戏,并且我正在将像素着色器应用到我的关卡,这样我就可以在游戏画面中添加效果了。着色器本身运行良好,但它有一个真正推动性能的缺陷。只要着色器处于活动状态,我绘制到屏幕上的任何内容都会像最大化它的alpha通道一样绘制。我正在使用XNA内置的Color
类绘制很多东西,其中大部分都有不同的alpha。但是,着色器似乎忽略了所有这些。即使我只是从着色器返回源代码,也会发生这种情况。
我见过几种可能的解决方案。第一个是绘制到RenderTarget2D,虽然这确实解决了这个问题,但它引起了更严重的alpha问题,我甚至不想进入。
我见过一些人声称在着色器中将颜色乘以alpha值似乎有所帮助,但这绝对没有任何区别,这表明alpha值输入始终被读为1。
以下是一些图片来说明我的问题:
希望有人知道如何解决这个问题。
答案 0 :(得分:0)
在Draw()方法中,您需要调用:
在调用任何调用着色器的方法(例如GraphicsDevice.BlendState = BlendState.NonPremultiplied;
等)之前DrawUserIndexedPrimitives
。
否则,框架假定alpha值已被预乘,并且它只能将RGB值直接blit到帧缓冲区。