Шейдер работает в редакторе, но не на iPhone - PullRequest
0 голосов
/ 12 марта 2020

Я использую следующий сценарий для актива рисования, найденного на этом веб-сайте .

Когда вы визуализируете лица своего я sh в ультрафиолетовом пространстве меня sh Вы восстанавливаете острова по одному треугольнику за раз. На краях острова может быть так, что из-за недооценки растеризатор не учитывает пиксель, который на самом деле находится на острове. Для этих пикселей ни один пиксельный шейдер не будет выполнен, и у вас останется складка. (текст и изображение взяты с сайта)

enter image description here

Основная идея c состоит в том, что каждый кадр после обновления текстуры краски, я запустите шейдер по всей текстуре и, используя фильтр и предварительно запеченную маску ультрафиолетовых островов, вытяните острова наружу.

Проблема в том, что он не работает на iPhone. Нет ошибок, нет странных раскрасок, похоже, что скрипт не применяется. Я не уверен, откуда возникла проблема. Может быть, для циклов for или буферов команд, используемых в c#.

Shader "Unlit/FixIlsandEdges"
{

    SubShader
    {
        // =====================================================================================================================
        // TAGS AND SETUP ------------------------------------------
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {


        // =====================================================================================================================
        // DEFINE AND INCLUDE ----------------------------------
            CGPROGRAM
            #pragma  vertex   vert
            #pragma  fragment frag

            #include "UnityCG.cginc"

            // =====================================================================================================================
            // DECLERANTIONS ----------------------------------
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv      : TEXCOORD0;
            };

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

                    sampler2D    _MainTex;
            uniform    float4        _MainTex_TexelSize;
                    sampler2D   _IlsandMap;

            // =====================================================================================================================
            // VERTEX FRAGMENT ----------------------------------
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv     = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {

            fixed4 col = tex2D(_MainTex, i.uv);
            float map  = tex2D(_IlsandMap,i.uv);

            float3 average = col;

            if (map.x < 0.2) {                                    // only take an average if it is not in a uv ilsand
                int n = 0;
                average = float3(0., 0., 0.);

                for (float x = -1.5; x <= 1.5; x++) {
                    for (float y = -1.5; y <= 1.5; y++) {

                        float3 c =  tex2D(_MainTex, i.uv + _MainTex_TexelSize.xy*float2(x, y));
                        float  m =  tex2D(_IlsandMap, i.uv + _MainTex_TexelSize.xy*float2(x, y));

                               n += step(0.1, m);
                         average += c * step(0.1, m);

                    }
                }

                average /= n;
            }

            col.xyz = average;

                return col;
            }
            ENDCG
        }
    }
}

Я где-то читал, что использование tex2D в циклах for - это большая проблема. нет, поэтому я изменил это на tex2Dlod, но происходит то же самое.

Вы можете проверить Git проект здесь

Я полностью потерян на этом и гугл не очень помогает. Спасибо за любые комментарии.

...