Shaders

Pips12

Membro
Boas a todos, será que alguém me poderia ajudar a perceber como funciona este shader?




Shader "tp2/alg4"
{
Properties
{
_mama("a", 2D) = "white" {}
_nana("batman", 2D) = "white" {}
_l("b", Vector) = (1,1,1,0)
}
SubShader
{
// No culling or depth
//Cull Off ZWrite Off ZTest Always

Blend SrcAlpha OneMinusSrcAlpha

Pass
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag

#include "UnityCG.cginc"

struct vs_in
{
float4 pos : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};

struct fs_in
{
float2 uv : TEXCOORD0;
float4 pos : SV_POSITION;
float3 rdir : TEXCOORD1;
float3 normal : NORMAL;
};

uniform sampler2D _mama;
uniform sampler2D _nana;
uniform float3 _l;

//volume esférico
float4 getColor(float3 pos, float3 center, float dist, float4 rand, float i, float2 uv)
{
if (length(pos*lerp(0.4, 1.0, abs(cos(_Time.y))) - center) < dist && frac(uv.x+abs(cos(_Time.y))) < 0.25 )
{
float4 c = tex2D(_nana, float2(abs(cos(uv.x+_Time.y)), abs(tan(uv.y*_Time.y))));
return float4(c.x, c.y, c.z, 0.05)*i*rand;
}
else
{
return float4(0, 0, 0, 0);
}
}


float4 march(float3 origin, float3 dir, int samples, float dist, float4 rand, float3 it, float2 uv)
{
float4 color = float4(0,0,0,0);
//esfera
float3 center = float3(0,0,0);
float r = 0.2;
float3 p = origin;
for (int i = 0; i < samples; i++)
{
p += dir * (dist / samples);
color += getColor(p, center, r, rand,it, uv);
//color += getColor(p, center, r);
}
return color;
}

fs_in vert(vs_in i)
{
fs_in o;
o.uv = i.uv;
o.pos = UnityObjectToClipPos(i.pos);
o.rdir = normalize(i.pos - _WorldSpaceCameraPos.xyz);
o.normal = i.normal;
return o;
}

float4 frag(fs_in i) : SV_Target
{
float3 or = _WorldSpaceCameraPos.xyz;
float3 dir = normalize(i.rdir);
int s = 5000;
float dist = 50;
float4 rand = tex2D(_mama, i.uv);
float it = max(dot(i.normal, _l),0);
return march(or, dir, s, dist, rand, it, i.uv);
}
ENDCG
}
}
}
 
Back
Topo