Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 颜色混合结果取决于元素的Z顺序?_Wpf_Colors_Mixing - Fatal编程技术网

Wpf 颜色混合结果取决于元素的Z顺序?

Wpf 颜色混合结果取决于元素的Z顺序?,wpf,colors,mixing,Wpf,Colors,Mixing,通常,如果我混合两种颜色,数学上我的期望值是:`(color1+color2)/2 0.4 * red + 0.6 * white = (1, 0.6, 0.6) 0.4 * green + 0.6 * (1, 0.6, 0.6) = (0.6, 0.76, 0.36) 白色+透明绿色+透明红色-> 0.4 * green + 0.6 * white = (0.6, 1, 0.6) 0.4 * red + 0.6 * (1, 0.6, 0.6) = (0.76, 0.6, 0.36) 结果取

通常,如果我混合两种颜色,数学上我的期望值是:`(color1+color2)/2<所以绿色/2+红色/2=黄色(255,0,0)/2+(0255,0)/2=(127127,0)`。


我用WPF准备了测试。我得到了我几乎无法解释的结果。

那你觉得呢?为什么以及结果如何依赖于z阶?

PS:我在这里没有名声,所以,我很抱歉,不能和你们分享一些照片,这让主题变得清晰。请花点时间将我的代码粘贴到您的项目中,看看我在这里说的是什么

PPS:下面是可视化WPF中颜色混合问题的代码

<Grid>
    <Grid.Resources>
        <Color A='100' R='0' G='0' B='255' x:Key='clr01' />
        <Color A='100' R='0' G='255' B='0' x:Key='clr02' />
        <Color A='100' R='255' G='0' B='0' x:Key='clr03' />

        <SolidColorBrush Color='{StaticResource clr01}' x:Key='scb01' />
        <SolidColorBrush Color='{StaticResource clr02}' x:Key='scb02' />
        <SolidColorBrush Color='{StaticResource clr03}' x:Key='scb03' />
    </Grid.Resources>
    <TabControl >
        <TabItem Header='case 1 rectangles (actual)'>
            <Grid>
                <Grid.Resources>
                    <Style TargetType='{x:Type Border}'>
                        <Setter Property='BorderBrush' Value='Black' />
                        <Setter Property='BorderThickness' Value='1' />
                        <Setter Property='SnapsToDevicePixels' Value='True' />
                        <Setter Property='Height' Value='20' />
                        <Setter Property='Width' Value='400' />
                    </Style>
                </Grid.Resources>
                <Canvas>
                    <Border Background='{StaticResource scb01}' Canvas.Left="10" Canvas.Top="10" />
                    <Border Background='{StaticResource scb02}' Canvas.Left="100" Canvas.Top="10" />

                    <Border Background='{StaticResource scb02}' Canvas.Left="100" Canvas.Top="40" />
                    <Border Background='{StaticResource scb01}' Canvas.Left="10" Canvas.Top="40" />



                    <Border Background='{StaticResource scb02}' Canvas.Left="10" Canvas.Top="90" />
                    <Border Background='{StaticResource scb03}' Canvas.Left="100" Canvas.Top="90" />

                    <Border Background='{StaticResource scb03}' Canvas.Left="100" Canvas.Top="120" />
                    <Border Background='{StaticResource scb02}' Canvas.Left="10" Canvas.Top="120" />



                    <Border Background='{StaticResource scb03}' Canvas.Left="10" Canvas.Top="170" />
                    <Border Background='{StaticResource scb01}' Canvas.Left="100" Canvas.Top="170" />

                    <Border Background='{StaticResource scb01}' Canvas.Left="100" Canvas.Top="200" />
                    <Border Background='{StaticResource scb03}' Canvas.Left="10" Canvas.Top="200" />
                </Canvas>
            </Grid>
        </TabItem>
        <TabItem Header='case 2 circles'>
            <Grid >
                <Grid.Resources>
                    <Style TargetType='{x:Type Ellipse}'>
                        <Setter Property='Stroke' Value='Black' />
                        <Setter Property='StrokeThickness' Value='1' />
                        <Setter Property='SnapsToDevicePixels' Value='True' />
                        <Setter Property='Width' Value='100' />
                        <Setter Property='Height' Value='100' />
                    </Style>
                    <Style TargetType='{x:Type Border}'>
                        <Setter Property='BorderBrush' Value='Black' />
                        <Setter Property='BorderThickness' Value='1' />
                        <Setter Property='SnapsToDevicePixels' Value='True' />
                        <Setter Property='Height' Value='250' />
                        <Setter Property='Width' Value='250' />
                    </Style>
                </Grid.Resources>
                <Canvas Background='White'>
                    <Border Canvas.Left="10" Canvas.Top="10">
                        <Canvas >
                            <Ellipse Canvas.Left="50" Canvas.Top="50"  Fill='{StaticResource scb01}' />
                            <Ellipse Canvas.Left="100" Canvas.Top="50" Fill='{StaticResource scb02}' />
                            <Ellipse Canvas.Left="75" Canvas.Top="100" Fill='{StaticResource scb03}' />
                        </Canvas>
                    </Border>
                    <Border Canvas.Left="270" Canvas.Top="10">
                        <Canvas >
                            <Ellipse Canvas.Left="75" Canvas.Top="100" Fill='{StaticResource scb03}' />
                            <Ellipse Canvas.Left="50" Canvas.Top="50"  Fill='{StaticResource scb01}' />
                            <Ellipse Canvas.Left="100" Canvas.Top="50" Fill='{StaticResource scb02}' />
                        </Canvas>
                    </Border>
                    <Border Canvas.Left="530" Canvas.Top="10">
                        <Canvas >
                            <Ellipse Canvas.Left="100" Canvas.Top="50" Fill='{StaticResource scb02}' />
                            <Ellipse Canvas.Left="75" Canvas.Top="100" Fill='{StaticResource scb03}' />
                            <Ellipse Canvas.Left="50" Canvas.Top="50"  Fill='{StaticResource scb01}' />
                        </Canvas>
                    </Border>
                </Canvas>
            </Grid>
        </TabItem>
    </TabControl>
</Grid>

更新: 用户2864740,感谢您的建议,以下是链接:

当你将颜色与透明度结合起来时,你应该应用以下等式:

result = alpha * srcColor + (1 - alpha) * dstColor
其中srcColor是顶部元素的颜色,dstColor是底部元素的颜色。 在你的例子中,α是100,大约是40%。所以你的公式不起作用

另一件需要考虑的是窗户的白色背景。实际上,你必须计算这个方程两次

让我们试着计算一下

白色+透明红色+透明绿色->

0.4 * red + 0.6 * white = (1, 0.6, 0.6)
0.4 * green + 0.6 * (1, 0.6, 0.6) = (0.6, 0.76, 0.36)
白色+透明绿色+透明红色->

0.4 * green + 0.6 * white = (0.6, 1, 0.6)
0.4 * red + 0.6 * (1, 0.6, 0.6) = (0.76, 0.6, 0.36)

结果取决于顺序,这就是为什么在3D中实现高性能透明度如此困难的原因。在2D中,您只需按Z顺序排序即可获得所需的结果。

包括相关图片的链接,有人会将其添加到内联中。这确实可以解释。还是很难理解,为什么顺序会影响结果。我同意-alpha 100有误导性,下次将再次检查我的代码是否与我的问题同步:)谢谢,我能够将此应用到我的项目中,效果非常好!