mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-30 02:42:54 +08:00
178 lines
4.8 KiB
HLSL
178 lines
4.8 KiB
HLSL
#include "BasicPS.hlsli"
|
|
|
|
|
|
PS_OUTPUT main(VS_OUTPUT input)
|
|
{
|
|
float4 c = float4(0.5, 0.5, 0.5, 1);
|
|
if (RenderMode == 0) c = float4(1, 1, 1, 1);
|
|
if (EnableTexture > 0)
|
|
{
|
|
float2 texc = input.Texcoord0;
|
|
if (RenderMode >= 5)
|
|
{
|
|
if (RenderSamplerCoord == 2)
|
|
texc = input.Texcoord1;
|
|
else if (RenderSamplerCoord == 3)
|
|
texc = input.Texcoord2;
|
|
}
|
|
|
|
c = Colourmap.Sample(TextureSS, texc);
|
|
|
|
if (EnableTexture > 1) //2+ enables diffuse2
|
|
{
|
|
float4 c2 = Colourmap2.Sample(TextureSS, input.Texcoord1);
|
|
c = c2.a * c2 + (1 - c2.a) * c;
|
|
}
|
|
if (EnableTint == 2)
|
|
{
|
|
//weapon tint
|
|
float tx = (round(c.a * 255.009995) - 32.0) * 0.007813; //okay R* this is just silly
|
|
float ty = 0.03125 * 0.5; // //1;//what to use for Y value? cb12[2].w in R* shader
|
|
float4 c3 = TintPalette.Sample(TextureSS, float2(tx, ty));
|
|
c.rgb *= c3.rgb;
|
|
c.a = 1;
|
|
}
|
|
|
|
if (IsDistMap) c = float4(c.rgb * 2, (c.r + c.g + c.b) - 1);
|
|
if (IsDecal == 4) c.a = c.r;
|
|
if ((IsDecal == 0) && (c.a <= 0.33)) discard;
|
|
if ((IsDecal == 1) && (c.a <= 0.0)) discard;
|
|
if ((IsDecal >= 3) && (c.a <= 0.0)) discard;
|
|
if (IsDecal == 0) c.a = 1;
|
|
if (IsDecal == 2)
|
|
{
|
|
float4 mask = TextureAlphaMask * c;
|
|
c.a = saturate(mask.r + mask.g + mask.b + mask.a);
|
|
c.rgb = 0;
|
|
}
|
|
c.a = saturate(c.a * AlphaScale);
|
|
}
|
|
if (EnableTint == 1)
|
|
{
|
|
c.rgb *= input.Tint.rgb;
|
|
}
|
|
if ((IsDecal == 1) || (IsDecal >= 3))
|
|
{
|
|
c.a *= input.Colour0.a;
|
|
}
|
|
|
|
float3 norm = normalize(input.Normal);
|
|
|
|
if (RenderMode == 1) //normals
|
|
{
|
|
c.rgb = norm * 0.5 + 0.5;
|
|
}
|
|
else if (RenderMode == 2) //tangents
|
|
{
|
|
c.rgb = normalize(input.Tangent.rgb) * 0.5 + 0.5;
|
|
}
|
|
else if (RenderMode == 3) //colours
|
|
{
|
|
c.rgb = input.Colour0.rgb;
|
|
if (RenderModeIndex == 2)
|
|
c.rgb = input.Colour1.rgb;
|
|
}
|
|
else if (RenderMode == 4) //texcoords
|
|
{
|
|
c.rgb = float3(input.Texcoord0, 0);
|
|
if (RenderModeIndex == 2) c.rgb = float3(input.Texcoord1, 0);
|
|
if (RenderModeIndex == 3) c.rgb = float3(input.Texcoord2, 0);
|
|
}
|
|
|
|
|
|
float3 spec = 0;
|
|
|
|
if (RenderMode == 0)
|
|
{
|
|
|
|
float4 nv = Bumpmap.Sample(TextureSS, input.Texcoord0);
|
|
float4 sv = Specmap.Sample(TextureSS, input.Texcoord0);
|
|
|
|
|
|
float2 nmv = nv.xy;
|
|
float4 r0 = 0, r1, r2, r3;
|
|
|
|
if (EnableNormalMap)
|
|
{
|
|
if (EnableDetailMap)
|
|
{
|
|
//detail normalmapp
|
|
r0.xy = input.Texcoord0 * detailSettings.zw;
|
|
r0.zw = r0.xy * 3.17;
|
|
r0.xy = Detailmap.Sample(TextureSS, r0.xy).xy - 0.5;
|
|
r0.zw = Detailmap.Sample(TextureSS, r0.zw).xy - 0.5;
|
|
r0.xy = r0.xy + r0.zw;
|
|
r0.yz = r0.xy * detailSettings.y; //r0.x = -r0.x*detailSettings.x;
|
|
nmv = r0.yz * sv.w + nv.xy; //add detail to normal, using specmap(!)
|
|
}
|
|
|
|
norm = NormalMap(nmv, bumpiness, input.Normal.xyz, input.Tangent.xyz, input.Bitangent.xyz);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (EnableSpecMap == 0)
|
|
{
|
|
sv = float4(0.1, 0.1, 0.1, 0.1);
|
|
}
|
|
|
|
float r1y = norm.z - 0.35;
|
|
|
|
float3 globalScalars = float3(0.5, 0.5, 0.5);
|
|
float globalScalars2z = 1; // 0.65; //wet darkness?
|
|
float wetness = 0; // 10.0;
|
|
|
|
r0.x = 0; // .5;
|
|
r0.z = 1 - globalScalars2z;
|
|
r0.y = saturate(r1y * 1.538462);
|
|
r0.y = r0.y * wetness;
|
|
r0.y = r0.y * r0.z;
|
|
r1.yz = input.Colour0.xy * globalScalars.zy;
|
|
r0.y = r0.y * r1.y;
|
|
r0.x = r0.x * sv.w + 1.0;
|
|
sv.xy = sv.xy * sv.xy;
|
|
r0.z = sv.w * specularFalloffMult;
|
|
r3.y = r0.z * 0.001953125; // (1/512)
|
|
r0.z = dot(sv.xyz, specMapIntMask);
|
|
r0.z = r0.z * specularIntensityMult;
|
|
r3.x = r0.x * r0.z;
|
|
r0.z = saturate(r0.z * r0.x + 0.4);
|
|
r0.z = 1 - r3.x * 0.5;
|
|
r0.z = r0.z * r0.y;
|
|
r0.y = r0.y * wetnessMultiplier;
|
|
r0.z = 1 - r0.z * 0.5;
|
|
|
|
float3 tc = c.rgb * r0.x;
|
|
c.rgb = tc * r0.z; //diffuse factors...
|
|
|
|
|
|
spec.xy = sqrt(r3.xy);
|
|
spec.z = r0.z;
|
|
|
|
}
|
|
|
|
|
|
float emiss = (IsEmissive == 1) ? 1.0 : 0.0;
|
|
|
|
c.a = saturate(c.a);
|
|
|
|
|
|
float4 a = c.aaaa;
|
|
if(IsDecal==3) a.xzw = 0; //normal_only
|
|
if(IsDecal==4) a.xyw = 0; //spec_only
|
|
|
|
|
|
PS_OUTPUT output;
|
|
output.Diffuse = float4(c.rgb, a.x);
|
|
output.Normal = float4(saturate(norm * 0.5 + 0.5), a.y);
|
|
output.Specular = float4(spec, a.z);
|
|
output.Irradiance = float4(input.Colour0.rg, emiss, a.w);
|
|
|
|
return output;
|
|
}
|
|
|
|
|
|
|