XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEEDToolBox

【WinUI】XFE精英危险工具箱

公开
关注 0 Fork 0 Star 0
UTF-8
cbuffer PowerActivityRingFrame:register(b11) {
    float4 ringEyeFocal,ringRightWidth,ringUpHeight,ringForwardNear;
    float4 ringMaterial; //quadCount,radialFeather,segmentFeather,solidRatio
    float4 ringOutput; //segmentCount,explicit scalar,HDR Write,use owned tool exposure texture
}
Texture2D<float> ringExposure:register(t20);
struct RingInput {float4 position:POSITION;float4 uAxisInner:UAXISINNER;float4 vAxisOuter:VAXISOUTER;float4 colour:USERDATA;};
struct RingPixel {float4 position:SV_POSITION;float4 radii:TEXCOORD;float4 colour:COLOR;};
RingPixel VSOriginalPowerActivityRing(RingInput input,uint vertex:SV_VertexID) {
    RingPixel p;float radius=(vertex&1)?input.uAxisInner.w:input.vAxisOuter.w/cos(3.141592653589793/ringMaterial.x);
    float angle=(vertex>>1)*(6.283185307179586/ringMaterial.x),sine,cosine;sincos(angle,sine,cosine);
    float2 local=float2(cosine,sine)*radius;
    float3 world=input.position.xyz+input.uAxisInner.xyz*local.x+input.vAxisOuter.xyz*local.y;
    float3 relative=world-ringEyeFocal.xyz;float depth=dot(relative,ringForwardNear.xyz);
    p.position=float4(dot(relative,ringRightWidth.xyz)*ringEyeFocal.w/(ringRightWidth.w*.5),
        dot(relative,ringUpHeight.xyz)*ringEyeFocal.w/(ringUpHeight.w*.5),ringForwardNear.w,depth);
    p.radii=float4(input.uAxisInner.w,input.vAxisOuter.w,local);p.colour=input.colour;return p;
}
float4 PSOriginalPowerActivityRing(RingPixel p):SV_TARGET {
    float r=length(p.radii.zw);if(r<=p.radii.x||r>=p.radii.y)discard;
    float radial=saturate((1-2*abs((r-p.radii.x)/(p.radii.y-p.radii.x)-.5))/ringMaterial.y);
    radial=radial*radial*(3-2*radial);
    float2 xy=p.radii.zw;float2 a=abs(xy);float q=min(a.x,a.y)/max(a.x,a.y),q2=q*q;
    // Actual DXBC float immediates; six-digit disassembly text loses bits.
    float angle=((((.02083509974181652*q2-.08513300120830536)*q2+.18014100193977356)*q2-.3302994966506958)*q2+.9998660087585449)*q;
    if(a.x<a.y)angle=1.570796326794897-angle;if(xy.x<0)angle-=3.141592653589793;
    if(min(xy.x,xy.y)<0&&max(xy.x,xy.y)>=0)angle=-angle;
    float phase=frac(frac(angle*.159154943091895)*ringOutput.x);
    float angular=saturate((2*abs(phase-.5)-(1-ringMaterial.w))/(ringMaterial.w*ringMaterial.z));
    angular=angular*angular*(3-2*angular);
    float emissive=ringOutput.w!=0?ringExposure.Load(int3(1,0,0))*.125:ringOutput.y;
    return float4(p.colour.rgb*(radial*angular)*emissive*ringOutput.z,p.colour.a);
}