Unity Scanlines Shader无法正常工作

时间:2017-11-04 18:12:25

标签: c# unity3d shader


我正在使用这个扫描线着色器,但它不起作用。
我尝试做的是如果y位置是2的倍数,将每个像素设置为黑色,但它不起作用。屏幕上没有任何变化。 颜色反转测试(通过将return col更改为return 1 - col完全正常,因此着色器实际上会影响图像。

有谁知道这是什么问题?
感谢。

    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"

        struct appdata
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
        };

        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
            float4 position : TEXCOORD1;
        };

        v2f vert (appdata v)
        {
            v2f o;
            o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
            o.uv = v.uv;
            o.position = ComputeScreenPos(o.vertex);
            return o;
        }

        sampler2D _MainTex;

        fixed4 frag (v2f i) : SV_Target
        {
            fixed4 col = tex2D(_MainTex, i.uv);

            if (i.uv.y % 2 == 0)
                col -= col;
            return col;
        }
        ENDCG
    }

编辑:我正在使用Unity 5.5.1f1,我的构建设置是独立的Windows / MacOSX / Linux。

1 个答案:

答案 0 :(得分:1)

首先i.uv的值介于0到1.如果这是后期处理效果,您希望窗口y位置为i.uv.y * _ScreenParams.y,或者您可以使用i.vertex.y

第二个someFloat % 2返回0..2范围内的浮点数(请参阅HLSL modulus operator) 所以if语句应该是:

if (i.uv.y * _ScreenParams.y  % 2 < 1)
   col -= col;

但是在这里你可以改用step函数。

fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);

    float ypos = i.uv.y * _ScreenParams.y;
    float ymod = ypos % 2;

    col.rgb *= step(1, ymod);

    return col;
}