Unity着色器像素操作

时间:2017-04-04 15:48:06

标签: unity3d shader fragment-shader

我在团结中学习着色器,并且我试图实现下面的图像。但我似乎无法让我的代码产生我的目标输出。我的最终目标是根据阵列的大小划分整个图像。知道如何纠正我的代码吗?

目标输出: Target output

代码:

Shader "Custom/PassArray"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags {"Queue"="Transparent"}
        Blend SrcAlpha OneMinusSrcAlpha

    Pass
    {
        CGPROGRAM

        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"
        uniform float4 _Test [3];

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

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

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

        sampler2D _MainTex;

        fixed4 frag (v2f i) : SV_Target
        {
            fixed4 col;

            _Test[0] = fixed4(0,0,1,1);
            _Test[1] = fixed4(1,0,0,1);
            _Test[2] = fixed4(0,1,0,1);

            //Test1: This code block produces output1 image.
            int index = round(i.uv.x*_Test.Length);
            col = _Test[index];

            //Test2: This codeblocks outputs pure green.
            //if(i.uv.x < 1/3){
            //  col = _Test[0];
            //}
            //else if(i.uv.x < 2/3){
            //  col = _Test[1];
            //}
            //else if(i.uv.x < 3/3){
            //  col = _Test[2];
            //}

            return col;
        }
        ENDCG
    }
}

}

实际输出: enter image description here

如果我理解正确,它会给我黑色像素,因为max i.uv.x是1.因此使索引3(基于计算i.uv.x / _Test.Length) 。但是我的数组中没有索引3。

2 个答案:

答案 0 :(得分:0)

改变到地板。因为你是四舍五入,大于2.5的值会四舍五入为3.你可能知道,一个包含3个元素的数组没有索引3,因此是黑条。

答案 1 :(得分:0)

我已经弄明白了。这里是任何可能发现它有用的人的更新代码。我将公式从 int index = round(i.uv.x _Test.Length); 更改为 int index = ceil(i.uv。 X / 1 _Test.Length)-1;

Shader "Custom/PassArray" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags {"Queue"="Transparent"} Blend SrcAlpha OneMinusSrcAlpha

    Pass
    {
        CGPROGRAM

        #pragma vertex vert
        #pragma fragment frag

        #include "UnityCG.cginc"
        uniform float4 _Test [3];

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

        struct v2f
        {
            float2 uv : TEXCOORD0;
            float4 vertex : SV_POSITION;
            float4 color : COLOR;
        };

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

        sampler2D _MainTex;

        fixed4 frag (v2f i) : SV_Target
        {
            fixed4 col;

            _Test[0] = fixed4(0,0,1,1);
            _Test[1] = fixed4(1,0,0,1);
            _Test[2] = fixed4(0,1,0,1);

            //Test1:
            int index = ceil(i.uv.x/1*_Test.Length)-1;
            col = _Test[index];

            return col;
        }
        ENDCG
    }
}

Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" uniform float4 _Test [3]; struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float4 color : COLOR; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float4 color : COLOR; }; v2f vert (appdata v) { v2f o; o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = v.uv; return o; } sampler2D _MainTex; fixed4 frag (v2f i) : SV_Target { fixed4 col; _Test[0] = fixed4(0,0,1,1); _Test[1] = fixed4(1,0,0,1); _Test[2] = fixed4(0,1,0,1); //Test1: int index = ceil(i.uv.x/1*_Test.Length)-1; col = _Test[index]; return col; } ENDCG } }