Помогите пожалуйста с этим делом, я уже себе голову сломал и совсем запутался
Есть задача написать альтернативный вариант "Flare" для Directional light используя построцессинг.
Задача в принципе не сложная, но я новичок в написании шейдеров и сильно путаюсь в командах =(
Умом я понимаю, что всего-то нужно взять вектор освещения, перемножить его на матрицу вид*проекция и полученные координаты использовать в качестве UV для размещения текстурки солнца на экране. Но как это оформить в коде я не знаю, там куча команд и всяких матриц, которые непонятно для меня работают.
Синтаксис:
Используется csharp
Shader "Custom/Lens"
{
Properties
{
_MainTex ("", 2D) = "white" {}
_LensTex ("Lens texture", 2D) = "white" {}
_Color ("Multiply color (RGB)", Color) = (0.5, 0.5, 0.5, 1)
}
SubShader
{
ZTest Always Cull Off ZWrite Off Fog { Mode Off }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
struct v2f
{
fixed4 pos : POSITION;
fixed2 uv : TEXCOORD0;
fixed4 lightScrPos : TEXCOORD3;
};
v2f vert (appdata_img v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord.xy;
o.lightScrPos = mul(UNITY_MATRIX_VP, normalize(_WorldSpaceLightPos0));
return o;
}
uniform sampler2D _MainTex;
uniform sampler2D _LensTex;
uniform fixed4 _Color;
fixed4 frag (v2f i) : COLOR
{
fixed4 orgCol = tex2D(_MainTex, i.uv);
fixed4 lens = tex2D(_LensTex, i.uv + i.lightScrPos); //тут дорабатывать конечно надо будет, но для демонстрации моей идеи думаю достаточно =)
return (orgCol + lens) * _Color;
}
ENDCG
}
}
FallBack "Diffuse"
}
{
Properties
{
_MainTex ("", 2D) = "white" {}
_LensTex ("Lens texture", 2D) = "white" {}
_Color ("Multiply color (RGB)", Color) = (0.5, 0.5, 0.5, 1)
}
SubShader
{
ZTest Always Cull Off ZWrite Off Fog { Mode Off }
Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
struct v2f
{
fixed4 pos : POSITION;
fixed2 uv : TEXCOORD0;
fixed4 lightScrPos : TEXCOORD3;
};
v2f vert (appdata_img v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = v.texcoord.xy;
o.lightScrPos = mul(UNITY_MATRIX_VP, normalize(_WorldSpaceLightPos0));
return o;
}
uniform sampler2D _MainTex;
uniform sampler2D _LensTex;
uniform fixed4 _Color;
fixed4 frag (v2f i) : COLOR
{
fixed4 orgCol = tex2D(_MainTex, i.uv);
fixed4 lens = tex2D(_LensTex, i.uv + i.lightScrPos); //тут дорабатывать конечно надо будет, но для демонстрации моей идеи думаю достаточно =)
return (orgCol + lens) * _Color;
}
ENDCG
}
}
FallBack "Diffuse"
}
Вот такая вот хрень у меня получилась =(
Синтаксис:
Используется csharp
o.lightScrPos = mul(UNITY_MATRIX_VP, normalize(_WorldSpaceLightPos0));
В общем я явно чего-то не правильно понимаю, пролейте свет пожалуйста