forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Эффекты/Шейдеры (http://forum.boolean.name/forumdisplay.php?f=170)
-   -   Не работает альфа. (http://forum.boolean.name/showthread.php?t=20531)

RegIon 14.01.2017 10:40

Не работает альфа.
 
Есть такой шейдер, который рисует колечки и сектора.

Код:

Shader "Custom/Circle" {
        Properties{
                _Color("Color", Color) = (1,0,0,0)
                _Thickness("Thickness", Range(0.0,0.5)) = 0.05
                _Radius("Radius", Range(0.0, 0.5)) = 0.4
                _Dropoff("Dropoff", Range(0.01, 4)) = 0.1
                _StartAngle("StartAngle", Range(0.0, 360.0)) = 0.0
                _Angle("Angle", Range(0.0, 360.0)) = 360.0
        }
                SubShader{
                Pass{
                Blend SrcAlpha OneMinusSrcAlpha // Alpha blending
                CGPROGRAM

#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
        #define M_PI 3.1415926535897932384626433832795

        fixed4 _Color; // low precision type is usually enough for colors
        float _Thickness;
        float _Radius;
        float _Dropoff;
        float _StartAngle;
        float _Angle;


        struct fragmentInput {
                float4 pos : SV_POSITION;
                float2 uv : TEXTCOORD0;
        };

        fragmentInput vert(appdata_base v)
        {
                fragmentInput o;

                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = v.texcoord.xy - fixed2(0.5,0.5);

                return o;
        }

        // r = radius
        // d = distance
        // t = thickness
        // p = % thickness used for dropoff
        float antialias(float r, float d, float t, float p) {
                if (d < (r - 0.5*t))
                        return -pow(d - r + 0.5*t,2) / pow(p*t, 2) + 1.0;
                else if (d > (r + 0.5*t))
                        return -pow(d - r - 0.5*t,2) / pow(p*t, 2) + 1.0;
                else
                        return 1.0;
        }
       
        //s = start angle radians
        //a = angle radian
        //pos = position

        float arc(fixed2 pos, float s, float a) {
               
                float c = atan2(pos.y, pos.x);
                if (c < 0)
                        c = 2*M_PI + c;
                float cut = 0;

               
                if (s + a > 2*M_PI)
                        cut = s + a - 2*M_PI;
               
                if (c >= s  && (c <= s + a  || (cut > 0 && c <= cut ) )) {
                        return 1.0;
                }

                return 0.0;
        }
       
        fixed4 frag(fragmentInput i) : SV_Target{

                float distance = sqrt(pow(i.uv.x, 2) + pow(i.uv.y,2));

                float aas = antialias(_Radius, distance, _Thickness, _Dropoff);
               
                float s = M_PI * _StartAngle / 180.0;
                float a = M_PI * _Angle / 180.0;
               
                float mul = arc(i.uv, s, a) * aas;

                return fixed4(_Color.r, _Color.g, _Color.b, _Color.a * mul);
        }

                ENDCG
        }
        }
}


Но как-то невзначай этот шейдер стал работать без прозрачности, при этом я его никак не менял.

Компилятор на ошибки не указывает:

Т.е вот так теперь (1 перекрывает 2, хотя не должно!):


До смены Unit на 5.5 нормально работал на телефоне, теперь вообще не работает!

Mr_F, я призываю тебя!

RegIon 14.01.2017 11:15

Ответ: Не работает альфа.
 
UPD:

с тегом AlphaToMask On заработало!

UPD

Блтяь! На мобиле все равно не работает!


UPD:
Цитата:

Lighting Off
ZWrite On
ZTest Always
Blend SrcAlpha OneMinusSrcAlpha
Измение очереди рендеринга через редактор решило проблему. Благо в Unity 5.5 для ZTest Always - шейдеров есть такой параметр!

Кто знает лучше вариант - пните.


Mr_F_ 14.01.2017 13:45

Ответ: Не работает альфа.
 
Цитата:

Mr_F, я призываю тебя!
Цитата:

с тегом AlphaToMask On заработало!
это alpha to coverage, будет работать только с MSAA.

тебе скорее всего нужен ZWrite Off, иначе если ближнее колечко первое запишет глубину (целого квада без прозрачности), то второе им загородится.
---
и queue = "Transparent" нужен, иначе сортироваться не будут альфаповерхности правильно.

RegIon 14.01.2017 20:05

Ответ: Не работает альфа.
 
Цитата:

Сообщение от Mr_F_ (Сообщение 311356)
это alpha to coverage, будет работать только с MSAA.

тебе скорее всего нужен ZWrite Off, иначе если ближнее колечко первое запишет глубину (целого квада без прозрачности), то второе им загородится.
---
и queue = "Transparent" нужен, иначе сортироваться не будут альфаповерхности правильно.

Я все включил все, но не на всех устройствах отображается.:wild: :wild: :wild: :wild: :wild:

ARA 14.01.2017 21:22

Ответ: Не работает альфа.
 
Попробуй
#pragma keepalpha

RegIon 14.01.2017 22:37

Ответ: Не работает альфа.
 
Цитата:

Сообщение от ARA (Сообщение 311363)
Попробуй
#pragma keepalpha

Спасибо, но переписал стандартный шейдер Sprite-Default. Теперь он обрезается как в UI (сектором).

Nex 15.01.2017 06:59

Ответ: Не работает альфа.
 
Не решение, но для мобил на юнити лучше писать шейдер при помощи встроенных юнити-шейдеров, а не CG. Может это и не труъ, но так получим одинаковый результат в едиторе и на всех мобилках.


Часовой пояс GMT +4, время: 04:52.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot