gpt4 book ai didi

wpf - 智能 DropShadowEffect

转载 作者:行者123 更新时间:2023-12-04 20:41:03 27 4
gpt4 key购买 nike

是否可以有DropShadowEffect渲染阴影时忽略某些颜色?有某种蒙版(颜色选择性)阴影?

我的问题是什么阴影可以分配给整个视觉元素(图形)。它看起来像这样:



而且我要



注意没有阴影的网格线(除了 0,0 的)。这可以通过在缩放/偏移图中同步 2 个来实现,一个没有包含网格的阴影效果,另一个带有包含其余部分的阴影。但是我对这个解决方案不是很满意(我预测该解决方案将来会出现很多问题)。所以我宁愿修改DropShadowEffect不知何故。

我可以创建和使用 ShaderEffect ,但我不知道如何对着色器进行编程以获得实际的阴影效果(如果它可以由着色器产生的话)。

也许用 DropShadowEffect 做某事更简单。本身?任何人?

编辑

我试图制作着色器效果:

sampler2D _input : register(s0);
float _width : register(C0);
float _height : register(C1);
float _depth : register(C2); // shadow depth

float4 main(float2 uv : TEXCOORD) : COLOR
{
// get pixel size
float2 pixel = {1 / _width, 1 / _height};

// find color at offset
float2 offset = float2(uv.x - pixel.x * _depth, uv.y - pixel.y * _depth);
float4 color = tex2D(_input, offset);

// convert to gray?
//float gray = dot(color, float4(0.1, 0.1, 0.1, 0));
//color = float4(gray, gray, gray, 1);

// saturate?
//color = saturate(color);

return tex2D(_input, uv) + color;
}

但凡事失败。

编辑

这是我喜欢的图形外观截图(对于那些试图说服我不要这样做的人):



目前它是通过特殊的 Graph 来实现的。其中有模板
<Border x:Name="PART_Border" BorderThickness="1" BorderBrush="Gray" CornerRadius="4" Background="White">
<Grid>
<Image x:Name="PART_ImageBack" Stretch="None"/>
<Image x:Name="PART_ImageFront" Stretch="None">
<Image.Effect>
<DropShadowEffect Opacity="0.3"/>
</Image.Effect>
</Image>
</Grid>
</Border>

一切都呈现在 PART_ImageFront 上(带阴影),而网格渲染到 PART_ImageBack (没有阴影)。性能方面还是不错的。

最佳答案

我对像素着色器的经验为零,但这是我对忽略“未着色”像素的阴影效果的快速而肮脏的尝试:

sampler2D _input : register(s0);
float _width : register(C0);
float _height : register(C1);
float _depth : register(C2);
float _opacity : register(C3);

float3 rgb_to_hsv(float3 RGB) {
float r = RGB.x;
float g = RGB.y;
float b = RGB.z;

float minChannel = min(r, min(g, b));
float maxChannel = max(r, max(g, b));

float h = 0;
float s = 0;
float v = maxChannel;

float delta = maxChannel - minChannel;

if (delta != 0) {
s = delta / v;

if (r == v) h = (g - b) / delta;
else if (g == v) h = 2 + (b - r) / delta;
else if (b == v) h = 4 + (r - g) / delta;
}

return float3(h, s, v);
}

float4 main(float2 uv : TEXCOORD) : COLOR {
float width = _width; // 512;
float height = _height; // 512;
float depth = _depth; // 3;
float opacity = _opacity; // 0.25;

float2 pixel = { 1 / width, 1 / height };

float2 offset = float2(uv.x - pixel.x * depth, uv.y - pixel.y * depth);
float4 srcColor = tex2D(_input, offset);

float3 srcHsv = rgb_to_hsv(srcColor);
float4 dstColor = tex2D(_input, uv);

// add shadow for colored pixels only
// tweak saturation threshold as necessary
if (srcHsv.y >= 0.1) {
float gray = dot(srcColor, float4(0.1, 0.1, 0.1, 0.0));
float4 multiplier = float4(gray, gray, gray, opacity * srcColor.a);
return dstColor + (float4(0.1, 0.1, 0.1, 1.0) * multiplier);
}

return dstColor;
}

这是针对我使用铅笔工具在 Blend 中绘制的(完全合法的)图表的操作:

Chart

着色器效果应用于包含轴、网格线和系列线的根面板,它仅为系列线生成阴影。

我认为期望着色器能够在忽略网格线的同时将阴影应用于轴和标签是不现实的;文本上的抗锯齿必然会与网格线的颜色/饱和度范围相交。我认为将阴影仅应用于系列线更干净,更美观。

关于wpf - 智能 DropShadowEffect,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26216904/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com