2013-12-07 3 views
1

Я пытаюсь написать HLSL для эмуляции маски прозрачности Photoshop: белый перевод в Alpha = 1 (непрозрачный), черный перевод в Alpha = 0 (прозрачный) и оттенки серого переведут на диапазон прозрачности. Следующий код HLSL, который я попробовал, имеет проблему, результирующее изображение состоит в том, что черная часть не является полностью прозрачной. Не знаю, почему. Кто-нибудь знает, что может быть проблемой?Эмуляция маски непрозрачности Photoshop для HLSL ShaderEffect

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

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; 
} 
+0

Привет, мне любопытно, вы заметили какие-либо улучшения в производительности, так как вы используете шейдеры вместо масок непрозрачности? – franssu

+1

Интересно, я сделал это, чтобы увидеть, будет ли производительность лучше, чем маска непрозрачности по умолчанию, которую я использовал в медиаэлементе в моем проекте. К сожалению, я понял, что сам элемент мультимедиа без маски непрозрачности уже много питается от частоты кадров, поэтому вывод не был из-за маскировки по умолчанию, которая влияет на производительность, именно HD-видео замедляло мой пользовательский интерфейс. до сих пор у меня все еще нет решения для чувствительного интерфейса с HD-видео, воспроизводимым в фоновом режиме. я буду проверять фактическую производительность этого HLSL, когда у меня будет время. Извини за это. – icube