Несколько наборов UV в Unity 3D

Я создал объект с текстурой и AO, они находятся в разных наборах UV в Maya (с многослойной текстурой), и в Maya пюре выглядит нормально.

Как добиться такого же эффекта в Unity3D?

Я не могу заставить Unity использовать 2-й набор UV.


person eblue    schedule 02.10.2013    source источник
comment
Ни один из встроенных шейдеров Unity не использует UV2 ни для чего, кроме карт освещения. Вам нужно будет написать свой собственный шейдер.   -  person Jessy    schedule 02.10.2013
comment
В Unity Asset Store доступно множество шейдеров. Возможно, уже есть тот, который использует UV2 для AO. Может стоить немного, но, вероятно, дешевле, чем тратить дни на изучение программирования шейдеров. (здесь упоминается поддержка АО вершины assetstore.unity3d.com/#/content/8880 Возможно, вы сможете связаться с ними, чтобы подтвердить, что он делает то, что вы хотите.)   -  person Calvin    schedule 02.10.2013


Ответы (1)


Вам нужно написать шейдер, который делает это. Вот очень минимальный пример, но вам, вероятно, потребуется более сложная настройка для бликов и т. д.

    Shader "Custom/twotex" {
        Properties {
            _MainTex ("Base (RGB)", 2D) = "white" {}
            _AoTex ("AO (RGB)", 2D) = "white" {}

        }
        SubShader {
            Tags { "RenderType"="Opaque" }
            LOD 200

            CGPROGRAM
            #pragma surface surf Lambert

            sampler2D _MainTex;
            sampler2D _AoTex;


            struct Input {
                float2 uv_MainTex : TEXCOORD0;
                float2 uv_AoTex :   TEXCOORD1;
            };

            void surf (Input IN, inout SurfaceOutput o) {
                half4 c = tex2D (_MainTex, IN.uv_MainTex.xy);
                half4 ao = tex2D (_AoTex, IN.uv_AoTex.xy);
                o.Albedo = c.rgb * ao.rgb;
                o.Alpha = c.a;
            }
            ENDCG
        } 
        FallBack "Diffuse"
    }
person theodox    schedule 04.10.2013
comment
Для тех, кому нужно больше информации об этом, я просто изменил его, чтобы он использовал второй набор UV из сетки, и добавил ползунок для управления интенсивностью (изменил следующие значения float2 uv_AoTex : TEXCOORD1; -> float2 uv2_AoTex : TEXCOORD1; и half4 ao = tex2D (_AoTex, IN.uv_AoTex.xy);) -> half4 ao = tex2D (_AoTex, IN.uv2_AoTex.xy);) - person eblue; 07.10.2013
comment
Кстати, я только что заметил, что он не читает альфа-канал, я изменил его так, чтобы он был #pragma surface Surf Lambert alpha, но тогда вся сетка полупрозрачна, вот ссылка ссылка , изображение справа не имеет Ao. - person eblue; 07.10.2013
comment
Вы хотите альфа-прозрачность? Приведенный выше пример должен работать, если строка прагмы включает alpha; но то, что вы получите, зависит от того, что находится в альфа-канале основного файла main. Если вам не нужна прозрачность, используйте o.Alpha = 1; Возможно ли, что ваш альфа-канал перевернут? - person theodox; 07.10.2013
comment
Это происходит не только с прозрачностью, простая диффузная текстура без какой-либо альфа-карты или прозрачности в ней дает тот же эффект, до сих пор я мог решить эту проблему, используя прозрачность выреза, но теперь этот шейдер не может обойти это так. - person eblue; 08.10.2013
comment
@eblue Это определенно 2 после uv2_AoTex, которые заставляют его работать, без этого он просто использует канал 1 uv ... очень странно. - person blented; 03.09.2015