Оффсет+рейкаст
Добавлено: 28 авг 2017, 18:48
Товарищи, такая ситуация. Находимся внутри сферы (сфера, соответственно, текстурирована изнутри). Камера стоит в центре и свободно крутится на 360 градусов по любой оси, испуская рэйкасты. Т.е. может бросить луч в любую точку сферы.
Что нужно - деформировать поверхность (промять) в точке рейкаста. Проминается шейдером, чёрная текстура с белым пятном посередине - где белое пятно там и проминается, соответственно.
Что хочу понять - как реализовать такое, чтобы маска смещалась оффсетом так, чтобы белое пятно в её центре всегда оказывалось в точке рэйкаста и, соответственно, проминала в этой точке сферу.
Вот кусок шэйдера ответственный за проминание:
void vertexDataFunc( inout appdata_full v, out Input o )
{
UNITY_INITIALIZE_OUTPUT( Input, o );
float4 uv_Spot = float4(v.texcoord * _Spot_ST.xy + _Spot_ST.zw, 0 ,0);
v.vertex.xyz += ( tex2Dlod( _Spot, uv_Spot ) * _Bulge ).xyz;
}
_Spot - это текстура с белым пятном
_Bulge - переменная, определяющая силу и направление проминания
И это ещё не вся печаль. Сфера не совсем сфера, а скиннед меш. Так что тут ещё вопросик - как отловит рэйкаст без коллайдера... Подобное есть в ассет сторе, и даже не жалко 30 баксов за такую работу, но хочется свою систему, дабы полностью понимать как она работает и не впадать в долгую прострацию при необходимости внесения изменений, как это бывает когда приходится ковырять чужие ассеты. В чужих мозгах копаться - сомнительное удовольствие...
Есть у кого идеи?
Что нужно - деформировать поверхность (промять) в точке рейкаста. Проминается шейдером, чёрная текстура с белым пятном посередине - где белое пятно там и проминается, соответственно.
Что хочу понять - как реализовать такое, чтобы маска смещалась оффсетом так, чтобы белое пятно в её центре всегда оказывалось в точке рэйкаста и, соответственно, проминала в этой точке сферу.
Вот кусок шэйдера ответственный за проминание:
void vertexDataFunc( inout appdata_full v, out Input o )
{
UNITY_INITIALIZE_OUTPUT( Input, o );
float4 uv_Spot = float4(v.texcoord * _Spot_ST.xy + _Spot_ST.zw, 0 ,0);
v.vertex.xyz += ( tex2Dlod( _Spot, uv_Spot ) * _Bulge ).xyz;
}
_Spot - это текстура с белым пятном
_Bulge - переменная, определяющая силу и направление проминания
И это ещё не вся печаль. Сфера не совсем сфера, а скиннед меш. Так что тут ещё вопросик - как отловит рэйкаст без коллайдера... Подобное есть в ассет сторе, и даже не жалко 30 баксов за такую работу, но хочется свою систему, дабы полностью понимать как она работает и не впадать в долгую прострацию при необходимости внесения изменений, как это бывает когда приходится ковырять чужие ассеты. В чужих мозгах копаться - сомнительное удовольствие...
Есть у кого идеи?