CodeWalker/CodeWalker.Shaders/Common.hlsli
2019-12-04 00:52:22 +11:00

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