|
14.01.2017, 10:40
|
#1
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Не работает альфа.
Есть такой шейдер, который рисует колечки и сектора.
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, я призываю тебя!
|
(Offline)
|
|
14.01.2017, 11:15
|
#2
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Не работает альфа.
UPD:
с тегом AlphaToMask On заработало!
UPD
Блтяь! На мобиле все равно не работает!
UPD:
Lighting Off
ZWrite On
ZTest Always
Blend SrcAlpha OneMinusSrcAlpha
|
Измение очереди рендеринга через редактор решило проблему. Благо в Unity 5.5 для ZTest Always - шейдеров есть такой параметр!
Кто знает лучше вариант - пните.
Последний раз редактировалось RegIon, 14.01.2017 в 12:25.
|
(Offline)
|
|
14.01.2017, 13:45
|
#3
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: Не работает альфа.
с тегом AlphaToMask On заработало!
|
это alpha to coverage, будет работать только с MSAA.
тебе скорее всего нужен ZWrite Off, иначе если ближнее колечко первое запишет глубину (целого квада без прозрачности), то второе им загородится.
---
и queue = "Transparent" нужен, иначе сортироваться не будут альфаповерхности правильно.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
|
|
14.01.2017, 20:05
|
#4
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Не работает альфа.
|
(Offline)
|
|
14.01.2017, 21:22
|
#5
|
ТЫ ЧООО?
Регистрация: 26.02.2007
Сообщений: 3,369
Написано 2,020 полезных сообщений (для 7,192 пользователей)
|
Ответ: Не работает альфа.
Попробуй
#pragma keepalpha
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
14.01.2017, 22:37
|
#6
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: Не работает альфа.
Сообщение от ARA
Попробуй
#pragma keepalpha
|
Спасибо, но переписал стандартный шейдер Sprite-Default. Теперь он обрезается как в UI (сектором).
|
(Offline)
|
|
15.01.2017, 06:59
|
#7
|
Гигант индустрии
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений (для 3,298 пользователей)
|
Ответ: Не работает альфа.
Не решение, но для мобил на юнити лучше писать шейдер при помощи встроенных юнити-шейдеров, а не CG. Может это и не труъ, но так получим одинаковый результат в едиторе и на всех мобилках.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо Nex за это полезное сообщение:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:23.
|