0

制作了一个 hlsl 像素着色器,用于为字幕添加轮廓/阴影。我的问题是我使用 Shazzam - Shader Editor 来查看它的效果,结果在我的程序中完全不同。例如:

我使用带有文本的 .png 为 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 中使用与着色器相同大小的图像,看看它是否可能是大小问题,但不是。

你们能看看我是否遗漏了什么吗?试过 sr = 0; SG = 0; 某人= 0; 萨 = 1;..

希望你能帮忙:)

4

1 回答 1

0

经过大量的试验和错误,它似乎不喜欢 for 循环。所以我现在只是在没有 for 循环和常量的情况下使用它。

这是一个答案而不是真正的解决方案..

于 2013-09-10T20:14:12.913 回答