const float packSizeSW = 16.0; void DoSnowyWorld(inout vec4 color, inout float smoothnessG, inout float highlightMult, inout float smoothnessD, inout float emission, vec3 playerPos, vec2 lmCoord, float snowFactor, float snowMinNdotU, float NdotU, int subsurfaceMode) { float snowFactorM = snowFactor * 1000.0 * max(NdotU - 0.9, snowMinNdotU) * max0(lmCoord.y - 0.9) * (0.9 - clamp(lmCoord.x, 0.8, 0.9)); if (snowFactorM <= 0.0001) return; vec3 worldPos = playerPos + cameraPosition; vec2 noiseCoord = floor(packSizeSW * worldPos.xz + 0.001) / packSizeSW; noiseCoord += floor(packSizeSW * worldPos.y + 0.001) / packSizeSW; float noiseTexture = dot(vec2(0.25, 0.75), texture2DLod(noisetex, noiseCoord * 0.45, 0.0).rg); vec3 snowColor = mix(vec3(0.65, 0.8, 0.85), vec3(1.0, 1.0, 1.0), noiseTexture * 0.75 + 0.125); color.rgb = mix(color.rgb, snowColor + color.rgb * emission * 0.2, snowFactorM); smoothnessG = mix(smoothnessG, 0.25 + 0.25 * noiseTexture, snowFactorM); highlightMult = mix(highlightMult, 2.0 - subsurfaceMode * 0.666, snowFactorM); smoothnessD = mix(smoothnessD, 0.0, snowFactorM); emission *= 1.0 - snowFactorM * 0.85; }