#ifndef SGAME_ENV_MAP_BASE #define SGAME_ENV_MAP_BASE #define SGAME_ENV_MAP_OUTPUT 0.5 #if defined(SGAME_ENV_MAP_GEN) float4x4 _MWorldToView; float _FarPlane; half _SGameEnvMapGenBoost; #endif #if defined(SGAME_ENV_MAP_GEN) inline float4 EnvMap_WorldToClipPos(float4 worldPos) { float4 pos = mul(_MWorldToView, worldPos); float distance = - pos.z; pos.xyz = normalize(pos.xyz); pos.xy /= (1 - pos.z); #if UNITY_UV_STARTS_AT_TOP pos.y = - pos.y; #endif float farPlane = _FarPlane; pos.z = (distance/farPlane); #if defined(SHADER_API_D3D11) || defined(SHADER_API_D3D11_9X) #else pos.z = pos.z * 2.0 - 1.0; #endif #if UNITY_REVERSED_Z pos.z = 1 - pos.z; #endif pos.w = 1.0; return pos; } inline float3 EnvMap_Normal( float3 normal) { float dir = _MWorldToView[2][2] * -1; float3 n = float3(normal.x, normal.y, normal.z * dir); return n; } inline half3 EnvMapGen_Output(half3 col) { half3 output = col.rgb * SGAME_ENV_MAP_OUTPUT; return output; } #endif #if defined(SGAME_ENV_MAP) TEXTURECUBE(_SGameEnvMap); SAMPLER(sampler_SGameEnvMap); TEXTURECUBE(_SGameEnvLerpMap); SAMPLER(sampler_SGameEnvLerpMap); half _SGameEnvLerp; half _SGameEnvMapStrength; inline half3 SGameEnvMapIBL(half roughness, half3 normal, half3 viewDir, half giIntensity = 1, half smoothness = 1) { half3 R = reflect(-viewDir, normal); // float4 uvs = EnvMap_UVs(R, roughness, smoothness); half4 srcColor = SAMPLE_TEXTURECUBE_LOD(_SGameEnvMap, sampler_SGameEnvMap, R, saturate(roughness) * 2); half4 dstColor = SAMPLE_TEXTURECUBE_LOD(_SGameEnvLerpMap, sampler_SGameEnvLerpMap, R, saturate(roughness) * 2); srcColor = lerp(srcColor, dstColor, clamp(_SGameEnvLerp, 0, 1)); #if defined(SGAME_ENV_MAP_STRENGTH) half3 specIBL = srcColor.rgb * giIntensity; specIBL *= _SGameEnvMapStrength; #else half3 specIBL = srcColor.rgb; #endif return specIBL; } #endif #endif