将Photoshop不透明蒙版模拟为HLSL ShaderEffect

时间:2013-12-07 18:26:24

标签: c wpf shader hlsl pixel-shader

我正在尝试编写一个HLSL来模拟Photoshop的不透明蒙版:白色转换为Alpha = 1(不透明),黑色转换为Alpha = 0(透明),灰色阴影将转换为透明度范围。我试过的以下HLSL代码有问题,结果图像是黑色部分不是完全透明的。不知道为什么。有谁知道可能是什么问题?

sampler2D input : register(s0);
sampler2D Mask : register(s1);

float4 main(float2 uv : TEXCOORD) : COLOR 
{ 


float4 color;
color = tex2D(input,uv);

float4 mask = tex2D(Mask, uv);    

// reverse the premultiply rgb values
mask.rgb = clamp(mask.rgb / mask.a, 0, 1);

float grayscale = dot(mask, float3(0.3, 0.59, 0.11));       
color.a = grayscale;    

return color;
}

opacity mask problem

1 个答案:

答案 0 :(得分:1)

Opps设法解决了我自己的问题。我在这里留下答案,以便那些想知道答案的人。解决方案是返回灰度和R,G,B通道的乘法,而不仅仅是设置A通道中的值。

sampler2D input : register(s0);
sampler2D Mask : register(s1);

float4 main(float2 uv : TEXCOORD) : COLOR 
{ 


float4 color;
color = tex2D(input,uv);    

float4 mask = tex2D(Mask, uv);
float grayscale = (mask.r + mask.g + mask.b) /3;

color.r = (color.r / color.a) * grayscale;
color.g = (color.g / color.a) * grayscale;
color.b = (color.b / color.a) * grayscale;
color.a = grayscale;

return color;
}