diff --git a/WickedEngine/brdf.hlsli b/WickedEngine/brdf.hlsli index b1775b51a..a848bbacf 100644 --- a/WickedEngine/brdf.hlsli +++ b/WickedEngine/brdf.hlsli @@ -214,59 +214,36 @@ float microfacetDistribution(in Surface surface, in SurfaceToLight surfaceToLigh // Aniso functions source: https://github.com/google/filament/blob/main/shaders/src/brdf.fs -float D_GGX_Anisotropic(float at, float ab, float ToH, float BoH, float NoH) { +float D_GGX_Anisotropic(in Surface surface, in SurfaceToLight surfaceToLight) +{ // Burley 2012, "Physically-Based Shading at Disney" // The values at and ab are perceptualRoughness^2, a2 is therefore perceptualRoughness^4 // The dot product below computes perceptualRoughness^8. We cannot fit in fp16 without clamping // the roughness to too high values so we perform the dot product and the division in fp32 - float a2 = at * ab; - float3 d = float3(ab * ToH, at * BoH, a2 * NoH); + float a2 = surface.at * surface.ab; + float3 d = float3(surface.ab * surfaceToLight.TdotH, surface.at * surfaceToLight.BdotH, a2 * surfaceToLight.NdotH); float d2 = dot(d, d); float b2 = a2 / d2; - return a2 * b2 * b2 * (1.0 / PI); + return a2 * b2 * b2 / PI; } -float V_SmithGGXCorrelated_Anisotropic(float at, float ab, float ToV, float BoV, - float ToL, float BoL, float NoV, float NoL) { +float V_SmithGGXCorrelated_Anisotropic(in Surface surface, in SurfaceToLight surfaceToLight) +{ // Heitz 2014, "Understanding the Masking-Shadowing Function in Microfacet-Based BRDFs" // TODO: lambdaV can be pre-computed for all the lights, it should be moved out of this function - float lambdaV = NoL * length(float3(at * ToV, ab * BoV, NoV)); - float lambdaL = NoV * length(float3(at * ToL, ab * BoL, NoL)); + float lambdaV = surfaceToLight.NdotL * length(float3(surface.at * surface.TdotV, surface.ab * surface.BdotV, surface.NdotV)); + float lambdaL = surface.NdotV * length(float3(surface.at * surfaceToLight.TdotL, surface.ab * surfaceToLight.BdotL, surfaceToLight.NdotL)); float v = 0.5 / (lambdaV + lambdaL); return saturate(v); } -float distributionAnisotropic(float at, float ab, float ToH, float BoH, float NoH) { - return D_GGX_Anisotropic(at, ab, ToH, BoH, NoH); -} - -float visibilityAnisotropic(float at, float ab, - float ToV, float BoV, float ToL, float BoL, float NoV, float NoL) { - return V_SmithGGXCorrelated_Anisotropic(at, ab, ToV, BoV, ToL, BoL, NoV, NoL); -} - // These are the functions that will be used by shaders: float3 BRDF_GetSpecular(in Surface surface, in SurfaceToLight surfaceToLight) { #ifdef BRDF_ANISOTROPIC - float Vis = visibilityAnisotropic( - surface.at, - surface.ab, - surface.TdotV, - surface.BdotV, - surfaceToLight.TdotL, - surfaceToLight.BdotL, - surface.NdotV, - surfaceToLight.NdotL - ); - float D = distributionAnisotropic( - surface.at, - surface.ab, - surfaceToLight.TdotH, - surfaceToLight.BdotH, - surfaceToLight.NdotH - ); + float Vis = V_SmithGGXCorrelated_Anisotropic(surface, surfaceToLight); + float D = D_GGX_Anisotropic(surface, surfaceToLight); #else float Vis = visibilityOcclusion(surface, surfaceToLight); float D = microfacetDistribution(surface, surfaceToLight); diff --git a/WickedEngine/captureImpostorPS_normal.hlsl b/WickedEngine/captureImpostorPS_normal.hlsl index d0778c007..a89076657 100644 --- a/WickedEngine/captureImpostorPS_normal.hlsl +++ b/WickedEngine/captureImpostorPS_normal.hlsl @@ -11,7 +11,7 @@ float4 main(PixelInputType input) : SV_Target0 if (g_xMaterial.uvset_normalMap >= 0) { float3 bumpColor; - NormalMapping(input.uvsets, P, N, TBN, bumpColor); + NormalMapping(input.uvsets, N, TBN, bumpColor); } return float4(N * 0.5f + 0.5f, 1); diff --git a/WickedEngine/objectHF.hlsli b/WickedEngine/objectHF.hlsli index e94546c42..d4a984de9 100644 --- a/WickedEngine/objectHF.hlsli +++ b/WickedEngine/objectHF.hlsli @@ -89,18 +89,12 @@ struct GBUFFEROutputType { float4 g0 : SV_Target0; // texture_gbuffer0 float4 g1 : SV_Target1; // texture_gbuffer1 - //float4 diffuse : SV_Target2; - //float4 specular : SV_Target3; }; inline GBUFFEROutputType CreateGbuffer(in float4 color, in Surface surface, in float2 velocity, in Lighting lighting) { - //LightingPart combined_lighting = CombineLighting(surface, lighting); - GBUFFEROutputType Out; Out.g0 = float4(color.rgb, surface.roughness); /*FORMAT_R16G16B16A16_FLOAT*/ Out.g1 = float4(encodeNormal(surface.N), velocity); /*FORMAT_R16G16B16A16_FLOAT*/ - //Out.diffuse = float4(combined_lighting.diffuse, 1); /*FORMAT_R11G11B10_FLOAT*/ - //Out.specular = float4(combined_lighting.specular, 1); /*FORMAT_R11G11B10_FLOAT*/ return Out; } @@ -127,7 +121,7 @@ inline void LightMapping(in float2 ATLAS, inout Lighting lighting) } } -inline void NormalMapping(inout float4 uvsets, in float3 V, inout float3 N, in float3x3 TBN, out float3 bumpColor) +inline void NormalMapping(inout float4 uvsets, inout float3 N, in float3x3 TBN, out float3 bumpColor) { [branch] if (g_xMaterial.normalMapStrength > 0 && g_xMaterial.uvset_normalMap >= 0) @@ -785,7 +779,7 @@ GBUFFEROutputType main(PIXELINPUT input) const float2 ReprojectedScreenCoord = ScreenCoord + velocity; #ifndef WATER - NormalMapping(input.uvsets, surface.P, surface.N, TBN, bumpColor); + NormalMapping(input.uvsets, surface.N, TBN, bumpColor); #endif // WATER #endif // ENVMAPRENDERING diff --git a/WickedEngine/wiVersion.cpp b/WickedEngine/wiVersion.cpp index 69122464f..05a3e168b 100644 --- a/WickedEngine/wiVersion.cpp +++ b/WickedEngine/wiVersion.cpp @@ -9,7 +9,7 @@ namespace wiVersion // minor features, major updates, breaking API changes const int minor = 50; // minor bug fixes, alterations, refactors, updates - const int revision = 11; + const int revision = 12; const std::string version_string = std::to_string(major) + "." + std::to_string(minor) + "." + std::to_string(revision);