Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > Unity > Эффекты/Шейдеры

Ответ
 
Опции темы
Старый 14.01.2017, 10:40   #1
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 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, я призываю тебя!
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 14.01.2017, 11:15   #2
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Не работает альфа.

UPD:

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

UPD

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


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

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

__________________
Сайт: http://iexpo.ml

Последний раз редактировалось RegIon, 14.01.2017 в 12:25.
(Offline)
 
Ответить с цитированием
Старый 14.01.2017, 13:45   #3
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Не работает альфа.

Mr_F, я призываю тебя!
с тегом AlphaToMask On заработало!
это alpha to coverage, будет работать только с MSAA.

тебе скорее всего нужен ZWrite Off, иначе если ближнее колечко первое запишет глубину (целого квада без прозрачности), то второе им загородится.
---
и queue = "Transparent" нужен, иначе сортироваться не будут альфаповерхности правильно.
__________________
бложик | geom.io | твиттер | faded | демо 1 2 | роботы | лайтмаппер
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Mr_F_ за это полезное сообщение:
ABTOMAT (16.01.2017), RegIon (14.01.2017)
Старый 14.01.2017, 20:05   #4
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Не работает альфа.

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

тебе скорее всего нужен ZWrite Off, иначе если ближнее колечко первое запишет глубину (целого квада без прозрачности), то второе им загородится.
---
и queue = "Transparent" нужен, иначе сортироваться не будут альфаповерхности правильно.
Я все включил все, но не на всех устройствах отображается.
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 14.01.2017, 21:22   #5
ARA
ТЫ ЧООО?
 
Аватар для ARA
 
Регистрация: 26.02.2007
Сообщений: 3,369
Написано 2,020 полезных сообщений
(для 7,192 пользователей)
Ответ: Не работает альфа.

Попробуй
#pragma keepalpha
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
RegIon (14.01.2017)
Старый 14.01.2017, 22:37   #6
RegIon
Элита
 
Аватар для RegIon
 
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,157
Написано 502 полезных сообщений
(для 1,012 пользователей)
Ответ: Не работает альфа.

Сообщение от ARA Посмотреть сообщение
Попробуй
#pragma keepalpha
Спасибо, но переписал стандартный шейдер Sprite-Default. Теперь он обрезается как в UI (сектором).
__________________
Сайт: http://iexpo.ml
(Offline)
 
Ответить с цитированием
Старый 15.01.2017, 06:59   #7
Nex
Гигант индустрии
 
Аватар для Nex
 
Регистрация: 13.09.2008
Сообщений: 2,893
Написано 1,185 полезных сообщений
(для 3,298 пользователей)
Ответ: Не работает альфа.

Не решение, но для мобил на юнити лучше писать шейдер при помощи встроенных юнити-шейдеров, а не CG. Может это и не труъ, но так получим одинаковый результат в едиторе и на всех мобилках.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо Nex за это полезное сообщение:
ABTOMAT (16.01.2017), ARA (15.01.2017)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com