Featured image of post Shader 2

Shader 2

Như chúng ta đã biết rằng là để xử lý dữ liệu đỉnh thì chúng ta sẽ xử lý bên trong vert.

Chúng ta sẽ xem shader sau, tác dụng của shader này giống như vòng lặp Tween.LocalScale cho game object đó về mặt hình ảnh.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Shader "Pancake/Sample"
{
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct v2f
            {
                float4 vertex : SV_POSITION;
            };

            v2f vert(appdata_base v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(float4(v.vertex.xyz * cos(_Time.y), v.vertex.z));
                return o;
            }

            fixed4 frag(v2f i) : COLOR
            {
                return half4(1, 1, 1, 1);
            }
            ENDCG
        }
    }
}

Dữ liệu chuyển từ bước xử lý vertex sang fragment chỉ là SV_POSITION mà thôi

Ở bước xử lý vertex thì chúng ta thực hiện chuyển đổi vị trí từ không gian 3d sang không gian 2d hiển thị trên màn hình bằng hàm UnityObjectToClipPos

Tọa độ x, y, z của mỗi đỉnh được nhân với cos(_Time.y) để có được sự biến thiên giá trị theo thời gian.

Kiểu dữ liệu của _Time là float4 (x, y, z, w) tương ứng với các giá trị (t/20, t, 2t, 3t). Giá trị _Time.y sẽ tương đương với sử dụng t

1
2
3
v2f o;
o.vertex = UnityObjectToClipPos(float4(v.vertex.xyz * sin(_Time.y), v.vertex.z));
return o;

Ở bước xử lý fragment chúng ta không xử lý gì cả mà trả về trực tiếp màu trắng.

1
 return half4(1, 1, 1, 1);

Kết quả thu được hiệu ứng như dưới đây

yenmoc
Lượt nghé thăm