#

Constellation Geometry Shader

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;
}

-> Check Effect Tool