1

我试图从 3D 渲染场景中保存一些纹理,然后让它们重用。
最大的问题是rgb值不能匹配它的alpha值。我需要一些没有黑边的图片,所以我必须使用rgb颜色来划分它的alpha值(Photoshop等图像处理软件只能处理alpha通道未预乘的图片.)
不幸的是,颜色太浅以至于某些结果值被截断为 1。
所以我转向了一种称为预乘 alpha 的技术。(查看更多)。我没有使用着色器,而是使用单独的 alpha 计算。
例如:
RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.InverseSourceAlpha;
现在我添加一些渲染状态。
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.InverseSourceAlpha;
它运作良好。但是当我尝试处理以下事情时:
RenderState.SourceBlend = Blend.SourceAlpha;
RenderState.DestinationBlend = Blend.One;
RenderState.SourceBlendAlpha = Blend.One;
RenderState.DestinationBlendAlpha = Blend.One;
结果完全错误,有人可以告诉我原因吗?
PS:现在我明白了。当我使用非预乘混合状态,即SourceAlpha和inverseSourceAlpha。rgba值肯定控制在0~1之间。但是当我切换到加法状态,即SourceAlpha和1时,rgb值可能超过一个,从而导致不正确的值。
现在我的问题是如何控制 alpha 值,以确保它保留所有细节并且不会同时溢出?

4

0 回答 0