mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-16 20:17:30 +08:00
178 lines
5.0 KiB
HLSL
178 lines
5.0 KiB
HLSL
|
|
|
|
|
|
struct ShaderGlobalLightParams
|
|
{
|
|
float3 LightDir;
|
|
float LightHdr; //global intensity
|
|
float4 LightDirColour;
|
|
float4 LightDirAmbColour;
|
|
float4 LightNaturalAmbUp;
|
|
float4 LightNaturalAmbDown;
|
|
float4 LightArtificialAmbUp;
|
|
float4 LightArtificialAmbDown;
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
//for unpacking colours etc
|
|
uint4 Unpack4x8(uint v)
|
|
{
|
|
return uint4(v >> 24, v >> 16, v >> 8, v) & 0xFF;
|
|
}
|
|
float4 Unpack4x8UNF(uint v)
|
|
{
|
|
float4 u = (float4)Unpack4x8(v);
|
|
return u*0.0039215686274509803921568627451f;// u * 1/255
|
|
}
|
|
|
|
|
|
|
|
float DepthFunc(float2 zw)
|
|
{
|
|
return zw.x;
|
|
|
|
////this sort of works for reverse depth buffering, but has issues with vertices behind the near clip plane.
|
|
////might need to adjust the viewproj matrix to fix that...
|
|
////(for this to work, also need to change GpuBuffers.Clear,.ClearDepth and ShaderManager DepthComparison,RenderFinalPass)
|
|
//return max(0.001 / zw.x, 0);
|
|
|
|
|
|
|
|
|
|
//return zw.x * (0.1 + 0.00001*(abs(zw.y)));
|
|
//return zw.x * (0.1 + 0.00001*((zw.y)));
|
|
|
|
|
|
|
|
//const float far = 1000.0; //outerra version - needs logz written to frag depth in PS...
|
|
//const float C = 0.01; //~10m linearization
|
|
//const float FC = 1.0/log(far*C + 1);
|
|
//////logz = gl_Position.w*C + 1; //version with fragment code
|
|
////logz = log(gl_Position.w*C + 1)*FC;
|
|
////gl_Position.z = (2*logz - 1)*gl_Position.w;
|
|
//float logz = log(zw.y*C + 1)*FC;
|
|
//return (2*logz - 1)*zw.y;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float3 GeomWindMotion(float3 ipos, float3 vc0, float4 windvec, float4 overrideparams)
|
|
{
|
|
|
|
//lt r1.x, r0.x, l(1.000000)
|
|
//mul r1.yzw, v2.xxxz, cb12[0].xxxy //umGlobalParams
|
|
//mul r1.yzw, r1.yyzw, cb9[13].xxxy //umGlobalOverrideParams
|
|
//add r2.x, v2.y, cb9[0].w //_worldPlayerPos_umGlobalPhaseShift
|
|
//mul r2.x, |r2.x|, l(6.283185)
|
|
//mul r2.yzw, cb9[13].zzzw, cb12[0].zzzw //umGlobalOverrideParams, umGlobalParams
|
|
//mad r2.xyz, cb2[12].xxxx, r2.yzwy, r2.xxxx //globalScalars2
|
|
//sincos r2.xyz, null, r2.xyzx
|
|
//mad r1.yzw, r2.xxyz, r1.yyzw, v0.xxyz
|
|
//movc r1.xyz, r1.xxxx, r1.yzwy, v0.xyzx
|
|
//add r1.w, -r0.x, l(1.000000)
|
|
//mul r0.xyz, r0.yzwy, r0.xxxx
|
|
//mad r0.xyz, r1.wwww, r1.xyzx, r0.xyzx
|
|
//mul r1.xyzw, r0.yyyy, cb1[9].xyzw
|
|
//mad r1.xyzw, r0.xxxx, cb1[8].xyzw, r1.xyzw
|
|
//mad r0.xyzw, r0.zzzz, cb1[10].xyzw, r1.xyzw
|
|
//add o0.xyzw, r0.xyzw, cb1[11].xyzw //screen pos out
|
|
//mov o1.xy, v4.xyxx
|
|
|
|
float3 f1 = vc0.xxz * windvec.xxy * overrideparams.xxy;
|
|
float phase = vc0.y + 0.0; //playerpos/global phase shift?
|
|
float phrad = abs(phase)*6.283185;
|
|
float3 f2 = windvec.zzw * overrideparams.zzw + phrad; //globalScalars2
|
|
f2 = sin(f2);
|
|
f1 = f2*f1 + ipos;
|
|
return f1;
|
|
|
|
//return ipos;
|
|
}
|
|
|
|
|
|
|
|
|
|
float3 NormalMap(float2 nmv, float bumpinezz, float3 norm, float3 tang, float3 bita)
|
|
{
|
|
//r1 = nmv; //sample r1.xyzw, v2.xyxx, t2.xyzw, s2 (BumpSampler)
|
|
//float bmp = max(bumpinezz, 0.001); //max r0.x, bumpiness, l(0.001000)
|
|
float2 nxy = nmv.xy * 2 - 1; //mad r0.yz, r1.xxyx, l(0.000000, 2.000000, 2.000000, 0.000000), l(0.000000, -1.000000, -1.000000, 0.000000)
|
|
float2 bxy = nxy * max(bumpinezz, 0.001); //mul r0.xw, r0.xxxx, r0.yyyz
|
|
float bxyz = sqrt(abs(1 - dot(nxy, nxy))); //r0.y = dot(nxy, nxy); //dp2 r0.y, r0.yzyy, r0.yzyy //r0.y = 1.0 - r0.y; //add r0.y, -r0.y, l(1.000000) //r0.y = sqrt(abs(r0.y)); //sqrt r0.y, |r0.y|
|
|
float3 t1 = tang * bxy.x; //mad r0.xzw, r0.xxxx, v4.xxyz, r1.xxyz
|
|
float3 t2 = bita * bxy.y + t1; //mul r1.xyz, r0.wwww, v5.xyzx
|
|
float3 t3 = norm * bxyz + t2; //mad r0.xyz, r0.yyyy, v3.xyzx, r0.xzwx
|
|
return normalize(t3);
|
|
//r0.w = dot(t3, t3); //dp3 r0.w, r0.xyzx, r0.xyzx
|
|
//r0.w = 1.0 / sqrt(r0.w); //rsq r0.w, r0.w
|
|
////r1.x = r0.z*r0.w - 0.35; //mad r1.x, r0.z, r0.w, l(-0.350000)
|
|
//t3 = t3*r0.w; //mul r0.xyz, r0.wwww, r0.xyzx
|
|
////mad o1.xyz, t3.xyzx, l(0.500000, 0.500000, 0.500000, 0.000000), l(0.500000, 0.500000, 0.500000, 0.000000)
|
|
//return t3;
|
|
}
|
|
|
|
|
|
|
|
|
|
float3 BasicLighting(float4 lightcolour, float4 ambcolour, float pclit)
|
|
{
|
|
return (ambcolour.rgb + lightcolour.rgb*pclit);
|
|
}
|
|
|
|
float3 AmbientLight(float3 diff, float normz, float4 upcolour, float4 downcolour, float amount)
|
|
{
|
|
float bf = normz*0.5 + 0.5;
|
|
float3 upval = upcolour.rgb*saturate(1.0-bf);
|
|
float3 downval = downcolour.rgb*saturate(bf);
|
|
return diff*(upval + downval)*amount;
|
|
//return (float3)0;
|
|
}
|
|
|
|
float3 GlobalLighting(float3 diff, float3 norm, float4 vc0, float lf, uniform ShaderGlobalLightParams globalLights)
|
|
{
|
|
float3 c = saturate(diff);
|
|
float3 fc = c;
|
|
float naturalDiffuseFactor = vc0.r;
|
|
float artificialDiffuseFactor = saturate(vc0.g);
|
|
c *= BasicLighting(globalLights.LightDirColour, globalLights.LightDirAmbColour, lf);
|
|
c += AmbientLight(fc, norm.z, globalLights.LightNaturalAmbUp, globalLights.LightNaturalAmbDown, naturalDiffuseFactor);
|
|
c += AmbientLight(fc, norm.z, globalLights.LightArtificialAmbUp, globalLights.LightArtificialAmbDown, artificialDiffuseFactor);
|
|
return c;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|