c# - 2D 像素着色器从颜色中移除 alpha channel

标签 c# xna shader alpha hlsl

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

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

我看到一些人声称在着色器中将颜色乘以 alpha 值似乎有所帮助,但这绝对没有区别,这对我来说意味着 alpha 值输入始终被读取为 1。

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

This is the result with the shader active This is what it's supposed to look like

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

最佳答案

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

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

关于c# - 2D 像素着色器从颜色中移除 alpha channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10541172/

相关文章:

c# - 如何使用C#显示打印机属性

c# - 将频率转换为-1..1浮点

opengl - GLSL gl_Position 中的第四维是什么?

opengl - 对象在 Alpha 背景上留下痕迹

c# - 保持 Android 应用程序在后台运行,防止它停止/死亡

c# - 在 ASP.NET RadioButtonList 中向 LI 添加类

c# - N 个线程异步获取/执行任务

C# Monogame - 如何在游戏窗口最小化时停止游戏循环

audio - 微软翻译的低音频质量

c++ - 如何清除opengl着色器缓存