Сделали пиксельный шейдер hlsl для добавления контура/тени для субтитров. Моя проблема в том, что я использую Shazzam - редактор шейдеров, чтобы посмотреть, как это будет, результат в моей программе совсем другой. Например:
Я использовал .png с текстом, чтобы сделать изображение для редактора Shazzam, но, как вы можете видеть, в программе (видеоплеере) есть небольшая подсказка, и я ее не понимаю.
Мой код:
struct VertexShaderInput
{
float4 Position : POSITION0; // model xyzw
float2 uv0: TEXCOORD0; // texture 0 uv
};
struct VertexShaderOutput
{
float4 Position : POSITION0; // model xyzw
float2 uv0: TEXCOORD0; // texture 0 uv
};
VertexShaderOutput vs(VertexShaderInput input)
{
VertexShaderOutput output;
output.Position = input.Position;
output.uv0 = input.uv0;
return output;
}
sampler2D YTexture : register(s0);
struct PixelShaderInput
{
float2 uv0: TEXCOORD0; // texture 0 uv
float4 color: COLOR; // color
};
float4 ps_osd(PixelShaderInput input): COLOR {
float4 px = tex2D(YTexture, input.uv0);
const float d = 0.2;
float cnt = 0;
float a = 0;
for (float x = -0.02*d; x < 0.02*d; x += 0.028*d)
{
a += tex2D(YTexture, input.uv0 + float2(x, 0)).a;
a += tex2D(YTexture, input.uv0 + float2(0, x)).a;
a += tex2D(YTexture, input.uv0 + x).a;
cnt += 0.1;
}
a /= cnt;
float4 s = a;
s.rgb = 0;
float4 r = float4(px.rgb*px.a + s.rgb*(1-px.a), max(px.a, a));
return r;
}
Фактически пиксельный шейдер — это ps_osd(), а vs — вершинный шейдер. Я новичок в HLSL, но не понимаю, почему это не должно работать. Видео имеет разрешение 1280x720, я пытался использовать изображение того же размера с шейдером в Shazzam, чтобы увидеть, может ли это быть проблемой с размером, но нет.
Можете ли вы увидеть, если я что-то пропустил? Пробовали s.r = 0; с.г = 0; с.б = 0; с.а = 1;..
Надеюсь, вы можете помочь :)