Tại sao sao chép đối tượng của tôi làm cho shader hoạt hình đỉnh của nó làm biến dạng nó?


7

Tôi đã sử dụng một shader đỉnh ( dựa trên ví dụ này ) để làm động một lá cờ vẫy. Khi tôi có một lá cờ duy nhất trong cảnh của mình, nó hoạt động chính xác.

Khi tôi sao chép cờ, tất cả các bản sao sẽ bị biến dạng dữ dội sau khi tôi nhấn play.

Hoạt hình cho thấy hành vi bình thường và biến dạng sau khi sao chép.

Đây là mã shader tôi đang sử dụng:

Shader "Custom/Flag" {
    Properties {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Speed ("Speed", Range(0, 5.0)) = 1
        _Frequency ("Frequency", Range(0, 1.3)) = 1
        _Amplitude ("Amplitude", Range(0, 5.0)) = 1
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        Cull off

        Pass {

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

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

            float _Speed;
            float _Frequency;
            float _Amplitude;

            v2f vert(appdata_base v)
            {
                v2f o;
                v.vertex.y +=  cos((v.vertex.x + _Time.y * _Speed) * _Frequency) * _Amplitude * (v.vertex.x - 5);
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                return tex2D(_MainTex, i.uv);
            }

            ENDCG

        }
    }
    FallBack "Diffuse"
}

Làm cách nào tôi có thể thực hiện công việc này với nhiều cờ bằng cùng một vật liệu?

Tôi có nên sử dụng một ví dụ vật liệu mới cho từng đối tượng như thế này không? Nó không có vẻ tối ưu:

    material = new Material (Shader); // Create new material
    material.SetFloat ("_Speed", _Speed);
    material.SetFloat ("_Frequency", _Frequency);
    material.SetFloat ("_Amplitude", _Amplitude);
    material.SetTexture ("_MainTex", _MainTex);
    flagObj.GetComponent<MeshRenderer>().sharedMaterial = material; // Set values

Câu trả lời:


7

Đây là hệ thống trộn tự động của Unity tại nơi làm việc.

Để tiết kiệm cho bạn thực hiện các cuộc gọi, khi Unity nhìn thấy nhiều mô hình (nhỏ) sử dụng cùng một vật liệu, nó kết hợp chúng thành một lưới duy nhất để nó có thể kết xuất tất cả chúng lại với nhau.

Để giữ lại biến đổi riêng lẻ của từng mô hình (dịch / xoay / tỷ lệ) trong không gian, các biến đổi được đưa vào các vị trí đỉnh trong một hệ tọa độ dùng chung cho toàn bộ lô, có thể khác rất nhiều so với hệ tọa độ cục bộ ban đầu của mô hình.

Điều này thường an toàn cho hầu hết các vật liệu, vì chúng ta thường không quan tâm đến việc hình học của chúng ta ở đâu trong không gian cục bộ, chỉ có vị trí kết quả của nó trong chế độ xem / định hướng của camera đối với các nguồn sáng.

Nhưng nó có thể tàn phá các shader đỉnh tạo ra các giả định về cách các đỉnh được bố trí trong hệ tọa độ cục bộ của mô hình - giống như các hình động của đỉnh thay thế các đỉnh trong không gian cục bộ hoặc điều chỉnh cường độ của chúng dựa trên vị trí cục bộ.

Cách khắc phục nhanh cho các shader này là thêm thẻ "DisableBatching"="True"vào các thẻ ShaderLab ở đầu của subshader. Điều này nói với Unity rằng vật liệu này không an toàn theo lô và nó sẽ quay trở lại để hiển thị từng mô hình riêng lẻ với hệ thống tọa độ ban đầu của nó, với một số chi phí cuộc gọi rút thăm.

Nếu bạn muốn kết xuất nhiều mô hình này mà vẫn nhận được lợi ích của việc tạo khối, bạn có thể sửa đổi một số shader để sử dụng các nguồn thông tin khác ở đây (ví dụ: sử dụng đỉnh bình thường làm hướng dịch chuyển thay vì giả sử nó chỉ dọc theo một địa phương cụ thể trục, hoặc sử dụng tọa độ UV để chia tỷ lệ và bù hiệu ứng thay vì vị trí cục bộ). Nếu bạn cần một nguồn đầu vào bổ sung, bạn có thể thêm màu đỉnh hoặc kênh tọa độ UV bổ sung. Các thuộc tính này không được sửa đổi khi tạo khối, do đó hiệu ứng của bạn sẽ không thay đổi khi được gộp lại với nhau (mặc dù việc thêm nhiều thuộc tính đỉnh có nghĩa là số lượng mô hình tối đa có thể được gộp lại với nhau sẽ nhỏ hơn, vì hiện tại mỗi loại sử dụng nhiều dữ liệu hơn)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.