From 855b2fc7add9ad65785f7669f6b33eb6bd5a94cf Mon Sep 17 00:00:00 2001 From: shadielhajj Date: Sat, 6 Jul 2024 20:13:07 +0100 Subject: [PATCH] envMap now uses DirectX11 syntax and automatically detects the max MIP level (hlsl only.) --- lighting/envMap.hlsl | 12 +++++++++--- lighting/fresnelReflection.hlsl | 2 +- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/lighting/envMap.hlsl b/lighting/envMap.hlsl index d5bc5598..671bd63d 100644 --- a/lighting/envMap.hlsl +++ b/lighting/envMap.hlsl @@ -22,11 +22,11 @@ license: */ #ifndef SAMPLE_CUBE_FNC -// #define SAMPLE_CUBE_FNC(CUBEMAP, NORM, LOD) texCUBE(CUBEMAP, NORM) -#define SAMPLE_CUBE_FNC(CUBEMAP, NORM, LOD) texCUBElod(CUBEMAP, float4(NORM, LOD) ) +//#define SAMPLE_CUBE_FNC(CUBEMAP, NORM, LOD) texCUBElod(CUBEMAP, float4(NORM, LOD) ) +#define SAMPLE_CUBE_FNC(CUBEMAP, NORM, LOD) CUBEMAP.SampleLevel(sampler##CUBEMAP, NORM, LOD) #endif -#ifndef ENVMAP_MAX_MIP_LEVEL +#if defined(ENVMAP_MAX_MIP_LEVEL) && !defined(UNITY_COMPILER_HLSL) #define ENVMAP_MAX_MIP_LEVEL 3.0 #endif @@ -39,6 +39,12 @@ float3 envMap(float3 _normal, float _roughness, float _metallic) { return ENVMAP_FNC(_normal, _roughness, _metallic); // Cubemap sampling +#elif defined(SCENE_CUBEMAP) && !defined(ENVMAP_MAX_MIP_LEVEL) + uint width, height, levels; + SCENE_CUBEMAP.GetDimensions(0, width, height, levels); + float lod = levels * _roughness; + return SAMPLE_CUBE_FNC( SCENE_CUBEMAP, _normal, lod).rgb; + #elif defined(SCENE_CUBEMAP) float lod = ENVMAP_MAX_MIP_LEVEL * _roughness; return SAMPLE_CUBE_FNC( SCENE_CUBEMAP, _normal, lod).rgb; diff --git a/lighting/fresnelReflection.hlsl b/lighting/fresnelReflection.hlsl index 8e7fad27..41974696 100644 --- a/lighting/fresnelReflection.hlsl +++ b/lighting/fresnelReflection.hlsl @@ -29,7 +29,7 @@ float3 fresnelReflection(float3 R, float3 f0, float NoV) { reflectColor = ENVMAP_FNC(R, 0.001, 0.001); #elif defined(SCENE_CUBEMAP) - reflectColor = SAMPLE_CUBE_FNC( SCENE_CUBEMAP, R, ENVMAP_MAX_MIP_LEVEL).rgb; + reflectColor = envMap( R, 1.0 ).rgb; #elif defined(SCENE_SH_ARRAY) reflectColor = sphericalHarmonics(R);