struct CtoV
{
float4 vObjectPos : POSITION;
float3 vNormal : NORMAL;
float2 vUV0 : TEXCOORD0;
float2 vUV1 : TEXCOORD1;
float2 vUV2 : TEXCOORD2;
float2 vUV3 : TEXCOORD3;
float2 vUV4 : TEXCOORD4;
float2 vUV5 : TEXCOORD5;
float2 vUV6 : TEXCOORD6;
float2 vUV7 : TEXCOORD7;
};
struct VtoG
{
float4 vProjPos : SV_POSITION;
float3 vNormal : NORMAL;
float4 vAniPos0 : TEXCOORD0;
float4 vAniPos1 : TEXCOORD1;
float4 vAniPos2 : TEXCOORD2;
float4 vAniPos3 : TEXCOORD3;
float3 vObjectPos : TEXCOORD4;
};
struct GtoF
{
float4 vProjPos : SV_POSITION;
float3 vNormal : NORMAL;
float2 vUV0 : TEXCOORD0;
float3 vObjectPos : TEXCOORD1;
float3 vWorldPos : TEXCOORD2;
float4 vAniTime0 : TEXCOORD3;
float4 vAniTime1 : TEXCOORD4;
float4 vRandom0 : TEXCOORD5;
float4 vRandom1 : TEXCOORD6;
};
VtoG vert(CtoV tIn)
{
VtoG tOut;
tOut.vObjectPos = tIn.vObjectPos.xyz;
tOut.vAniPos0 = float4(tIn.vUV0.xy, tIn.vUV1.xy);
tOut.vAniPos1 = float4(tIn.vUV2.xy, tIn.vUV3.xy);
tOut.vAniPos2 = float4(tIn.vUV4.xy, tIn.vUV5.xy);
tOut.vAniPos3 = float4(tIn.vUV6.xy, tIn.vUV7.xy);
tOut.vNormal = normalize(tIn.vNormal);
tOut.vProjPos = TransformCoordV4(TransformCoordV3(tOut.vObjectPos, GetWorldMaxrixFromClient()), GetViewProjMaxrixFromClient());
return tOut;
}
[maxvertexcount(6)]
void geom(
uint iPolyID : SV_PrimitiveID,
triangle VtoG arrIn[3],
inout TriangleStream<GtoF> tOut)
{
GtoF tOut0;
GtoF tOut1;
GtoF tOut2;
GtoF tOut3;
float fRandom0 = _Time.y * 720 + random(float2(iPolyID, iPolyID), 0, 1080);
float fRandom1 = random(float2(iPolyID, iPolyID), 0, 1);
float fRandom2 = _Time.y * 360 + random(float2(iPolyID, iPolyID), 0, 360);
float fRandom3 = random(float2(iPolyID , iPolyID) * 100, 0, 1);
float fRandom4 = 0;
float fRandom5 = 0;
float fRandom6 = 0;
float fRandom7 = 0;
float fTime = frac(_Time.y * 0.1);
float fAniTime0 = saturate(remap(fTime, float2(0.0, 0.2), float2(0, 1)));
float fAniTime1 = saturate(remap(fTime, float2(0.0 + fRandom3 * 0.04, 0.2 + fRandom3 * 0.04), float2(0, 1)));
float fAniTime2 = saturate(remap(fTime, float2(0.1 + fRandom3 * 0.15, 0.2 + fRandom3 * 0.15), float2(0, 1)));
float fAniTime3 = saturate(remap(fTime, float2(0.3, 0.5 + _fAniTimeOffset), float2(0, 1)));
float fAniTime4 = saturate(remap(fTime, float2(0.4, 0.79), float2(0, 1)));
float fAniTime5 = smoothstep(0.4, 0.6, saturate(remap(fTime, float2(0.5, 0.8), float2(0, 1))));
float fAniTime6 = pow(abs(fAniTime5 - 0.5) * 2, 0.3);
float fAniTime7 = saturate(remap(fTime, float2(0.67, 0.74), float2(0, 1)));
float fAnimationTime = frac((fAniTime3 * 0.99999) * 16);
float fAnimationIdx = floor((fAniTime3 * 0.99999) * 16);
float fScale = lerp(lerp(lerp(lerp(_fScale, 0.15, fAniTime0), _fScale, fAniTime1), 0.02, fAniTime4), 0, pow(fAniTime7, 0.2));
float4x4 matLocal;
float4x4 matLocal0 = float4x4(
float4(-fScale, +fScale, +fScale, -fScale),
float4(+fScale, +fScale, -fScale, -fScale),
float4(0, 0, 0, 0),
float4(1, 1, 1, 1));
float4x4 matLocal1 = float4x4(
float4(-fScale * (1 + fAniTime6 * 50), +fScale * (1 + fAniTime6 * 50), +fScale * (1 + fAniTime6 * 50), -fScale * (1 + fAniTime6 * 50)),
float4(+fScale * 0.05, +fScale * 0.05, -fScale * 0.05, -fScale * 0.05),
float4(0, 0, 0, 0),
float4(1, 1, 1, 1));
float4x4 matWorld;
float4x4 matPosition;
float3 arrAniPos[17];
float3 vAniPos0;
float3 vCenterPos = (arrIn[0].vObjectPos.xyz + arrIn[1].vObjectPos.xyz + arrIn[2].vObjectPos.xyz)/ 3;
arrAniPos[0] = float3(vCenterPos.x, vCenterPos.y, vCenterPos.z);
arrAniPos[1] = float3(arrIn[0].vAniPos0.x, arrIn[1].vAniPos0.x, arrIn[2].vAniPos0.x);
arrAniPos[2] = float3(arrIn[0].vAniPos0.y, arrIn[1].vAniPos0.y, arrIn[2].vAniPos0.y);
arrAniPos[3] = float3(arrIn[0].vAniPos0.z, arrIn[1].vAniPos0.z, arrIn[2].vAniPos0.z);
arrAniPos[4] = float3(arrIn[0].vAniPos0.w, arrIn[1].vAniPos0.w, arrIn[2].vAniPos0.w);
arrAniPos[5] = float3(arrIn[0].vAniPos1.x, arrIn[1].vAniPos1.x, arrIn[2].vAniPos1.x);
arrAniPos[6] = float3(arrIn[0].vAniPos1.y, arrIn[1].vAniPos1.y, arrIn[2].vAniPos1.y);
arrAniPos[7] = float3(arrIn[0].vAniPos1.z, arrIn[1].vAniPos1.z, arrIn[2].vAniPos1.z);
arrAniPos[8] = float3(arrIn[0].vAniPos1.w, arrIn[1].vAniPos1.w, arrIn[2].vAniPos1.w);
arrAniPos[9] = float3(arrIn[0].vAniPos2.x, arrIn[1].vAniPos2.x, arrIn[2].vAniPos2.x);
arrAniPos[10] = float3(arrIn[0].vAniPos2.y, arrIn[1].vAniPos2.y, arrIn[2].vAniPos2.y);
arrAniPos[11] = float3(arrIn[0].vAniPos2.z, arrIn[1].vAniPos2.z, arrIn[2].vAniPos2.z);
arrAniPos[12] = float3(arrIn[0].vAniPos2.w, arrIn[1].vAniPos2.w, arrIn[2].vAniPos2.w);
arrAniPos[13] = float3(arrIn[0].vAniPos3.x, arrIn[1].vAniPos3.x, arrIn[2].vAniPos3.x);
arrAniPos[14] = float3(arrIn[0].vAniPos3.y, arrIn[1].vAniPos3.y, arrIn[2].vAniPos3.y);
arrAniPos[15] = float3(arrIn[0].vAniPos3.z, arrIn[1].vAniPos3.z, arrIn[2].vAniPos3.z);
arrAniPos[16] = float3(arrIn[0].vAniPos3.w, arrIn[1].vAniPos3.w, arrIn[2].vAniPos3.w);
vAniPos0 = lerp(arrAniPos[fAnimationIdx], arrAniPos[fAnimationIdx + 1], fAnimationTime);
float3 vAniPos1 = float3(0, 0, 1);
vAniPos1 = TransformCoordV3(vAniPos1, Translation(float3(0, (1 - (2 * abs(fRandom1 - 0.5)) * 0.5) * lerp(-0.59, 0.59, step(fRandom3, 0.5)), 0)));
vAniPos1 = TransformCoordV3(vAniPos1, Rotate_Z(fRandom0 * 0.7));
vAniPos1 = TransformCoordV3(vAniPos1, Translation(float3( 0, 0.5, -0.4 - fRandom1 * 1.4)));
float3 vAniPos2 = float3(0, 0, 1);
vAniPos2 = TransformCoordV3(vAniPos2, Translation(float3(0, (0.1 + pow(1 - abs(fRandom1 - 0.5) * 2, 1) * 1.2) * lerp(-0.3, 0.3, step(fRandom3, 0.5)), 0)));
vAniPos2 = TransformCoordV3(vAniPos2, Rotate_Z(fRandom0 * 1));
vAniPos2 = TransformCoordV3(vAniPos2, Translation(float3(0, 0.5, -fRandom1 * 1.5)));
float3 vDir = normalize((arrIn[0].vNormal + arrIn[1].vNormal + arrIn[2].vNormal));
float3 vAniPos3 = float3(0, 0, 5 * pow(fAniTime7, 1));
vAniPos3 = TransformCoordV3(vAniPos3, Rotate_Y(fRandom0));
vAniPos3 = TransformCoordV3(vAniPos3, Translation(float3(0, 0.5, 0) + vDir * 0.01));
float3 vAniPos;
vAniPos = lerp(vAniPos1, vAniPos0, pow(fAniTime2, 1));
vAniPos = lerp(vAniPos, vAniPos2, pow(min(pow(fAniTime4, 0.5), lerp(0.44, 0.90, step(fRandom3, 0.2))), 2.5));
vAniPos = lerp(vAniPos, lerp(vAniPos0, vAniPos2, 0.2), pow(fAniTime5, 0.4));
vAniPos = lerp(vAniPos - vAniPos * pow(fAniTime7, 0.2), vAniPos3, pow(fAniTime7, 0.5));
matLocal0 = mul(Rotate_Z(-fRandom2), matLocal0);
matLocal = lerp(matLocal0, matLocal1, pow(1 - fAniTime6, 0.4));
matWorld = mul(Scale(pow(fAniTime1,1)), Translation(vAniPos));
matPosition = mul(mul(matWorld, Billboard(mul(GetWorldMaxrixFromClient(), matWorld))), matLocal);
tOut0.vObjectPos = float3(matPosition._m00, matPosition._m10, matPosition._m20);
tOut1.vObjectPos = float3(matPosition._m01, matPosition._m11, matPosition._m21);
tOut2.vObjectPos = float3(matPosition._m02, matPosition._m12, matPosition._m22);
tOut3.vObjectPos = float3(matPosition._m03, matPosition._m13, matPosition._m23);
matWorld = mul(Translation(GetWorldDir() * 8 * pow(saturate(lerp(-0.3, 1, fAniTime5) + fRandom3 * 0.3), 3)), GetWorldMaxrixFromClient());
tOut0.vWorldPos = TransformCoordV3(tOut0.vObjectPos, matWorld);
tOut1.vWorldPos = TransformCoordV3(tOut1.vObjectPos, matWorld);
tOut2.vWorldPos = TransformCoordV3(tOut2.vObjectPos, matWorld);
tOut3.vWorldPos = TransformCoordV3(tOut3.vObjectPos, matWorld);
float3 vNormal = VertexToNormal(arrIn[0].vObjectPos, arrIn[1].vObjectPos, arrIn[2].vObjectPos);
tOut0.vNormal = TransformNormal(vNormal, GetWorldMaxrixFromClient());
tOut1.vNormal = TransformNormal(vNormal, GetWorldMaxrixFromClient());
tOut2.vNormal = TransformNormal(vNormal, GetWorldMaxrixFromClient());
tOut3.vNormal = TransformNormal(vNormal, GetWorldMaxrixFromClient());
tOut0.vProjPos = TransformCoordV4(tOut0.vWorldPos, GetViewProjMaxrixFromClient());
tOut1.vProjPos = TransformCoordV4(tOut1.vWorldPos, GetViewProjMaxrixFromClient());
tOut2.vProjPos = TransformCoordV4(tOut2.vWorldPos, GetViewProjMaxrixFromClient());
tOut3.vProjPos = TransformCoordV4(tOut3.vWorldPos, GetViewProjMaxrixFromClient());
tOut0.vUV0 = float2(1,0);
tOut1.vUV0 = float2(1,1);
tOut2.vUV0 = float2(0,1);
tOut3.vUV0 = float2(0,0);
tOut0.vAniTime0 = float4(fAniTime0, fAniTime1, fAniTime2, fAniTime3);
tOut1.vAniTime0 = float4(fAniTime0, fAniTime1, fAniTime2, fAniTime3);
tOut2.vAniTime0 = float4(fAniTime0, fAniTime1, fAniTime2, fAniTime3);
tOut3.vAniTime0 = float4(fAniTime0, fAniTime1, fAniTime2, fAniTime3);
tOut0.vAniTime1 = float4(fAniTime4, fAniTime5, fAniTime6, fAniTime7);
tOut1.vAniTime1 = float4(fAniTime4, fAniTime5, fAniTime6, fAniTime7);
tOut2.vAniTime1 = float4(fAniTime4, fAniTime5, fAniTime6, fAniTime7);
tOut3.vAniTime1 = float4(fAniTime4, fAniTime5, fAniTime6, fAniTime7);
tOut0.vRandom0 = float4(fRandom0, fRandom1, fRandom2, fRandom3);
tOut1.vRandom0 = float4(fRandom0, fRandom1, fRandom2, fRandom3);
tOut2.vRandom0 = float4(fRandom0, fRandom1, fRandom2, fRandom3);
tOut3.vRandom0 = float4(fRandom0, fRandom1, fRandom2, fRandom3);
tOut0.vRandom1 = float4(fRandom4, fRandom5, fRandom5, fRandom7);
tOut1.vRandom1 = float4(fRandom4, fRandom5, fRandom5, fRandom7);
tOut2.vRandom1 = float4(fRandom4, fRandom5, fRandom5, fRandom7);
tOut3.vRandom1 = float4(fRandom4, fRandom5, fRandom5, fRandom7);
tOut.Append(tOut0);
tOut.Append(tOut1);
tOut.Append(tOut2);
tOut.RestartStrip();
tOut.Append(tOut0);
tOut.Append(tOut2);
tOut.Append(tOut3);
tOut.RestartStrip();
}
float4 frag(GtoF tIn) : SV_Target
{
float4 vColor = float4(0,0.2,7,1);
float fTime = 0;
float2 vCulling_F = step( 2 * abs(tIn.vUV0 - float2(0.5, 0.5)), float2(0.1 * pow(tIn.vAniTime0.z, 0.2) + fTime, 0.1 * pow(tIn.vAniTime0.z, 0.2) + fTime));
float2 vCulling_B = step(float2(fTime, fTime), 2 * abs(tIn.vUV0 - float2(0.5, 0.5)));
clip(saturate((vCulling_F * vCulling_B).x + (vCulling_F * vCulling_B).y) - 0.5);
float4 vAniColor0 = vColor * 0.1;
float4 vAniColor1 = lerp(float4(0.1, 0.1, 10, 1), float4(0.1, 1, 10, 1) * 0.05, pow(abs(tIn.vRandom0.y - 0.5) * 2, 1));
float4 vAniColor2 = vColor * 0.3;
float4 vAniColor3 = float4(0, 0, 0, 1);
vColor = lerp(vAniColor0, vColor, tIn.vAniTime0.z);
vColor = lerp(vColor, vAniColor1, tIn.vAniTime1.x);
vColor = lerp(vColor, vAniColor2, pow(saturate(lerp(-0.3, 1, tIn.vAniTime1.y) + tIn.vRandom0.w * 0.3), 3));
vColor = lerp(vColor, vAniColor3, pow(tIn.vAniTime1.w, 0.3));
vColor = vColor;
vColor.a = 1;
return vColor;
}