From 9d560d9b12f17f6dca363d0fabf00a300faa83aa Mon Sep 17 00:00:00 2001 From: Azaezel Date: Sun, 9 Dec 2018 16:57:14 -0600 Subject: [PATCH] skylight conversion --- .../advanced/gl/reflectionProbeP.glsl | 2 +- .../lighting/advanced/gl/skylightP.glsl | 101 +++++++++--------- 2 files changed, 49 insertions(+), 54 deletions(-) diff --git a/Templates/Full/game/shaders/common/lighting/advanced/gl/reflectionProbeP.glsl b/Templates/Full/game/shaders/common/lighting/advanced/gl/reflectionProbeP.glsl index 51b3926d1..fee0b8783 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/gl/reflectionProbeP.glsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/gl/reflectionProbeP.glsl @@ -24,7 +24,7 @@ #include "farFrustumQuad.glsl" #include "../../../gl/torque.glsl" #include "../../../gl/lighting.glsl" -#line 6 +#line 27 in vec4 pos; in vec4 wsEyeDir; diff --git a/Templates/Full/game/shaders/common/lighting/advanced/gl/skylightP.glsl b/Templates/Full/game/shaders/common/lighting/advanced/gl/skylightP.glsl index 58c14364d..7b174641d 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/gl/skylightP.glsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/gl/skylightP.glsl @@ -1,11 +1,30 @@ +//----------------------------------------------------------------------------- +// Copyright (c) 2012 GarageGames, LLC +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. +//----------------------------------------------------------------------------- #include "../../../gl/hlslCompat.glsl" #include "shadergen:/autogenConditioners.h" - #include "farFrustumQuad.glsl" -#include "lightingUtils.glsl" #include "../../../gl/lighting.glsl" #include "../../../gl/torque.glsl" -#line 8 +#line 27 in vec4 pos; in vec4 wsEyeDir; @@ -13,75 +32,51 @@ in vec4 ssPos; in vec4 vsEyeDir; uniform sampler2D deferredBuffer; +uniform sampler2D colorBuffer; uniform sampler2D matInfoBuffer; uniform samplerCube cubeMap; uniform samplerCube irradianceCubemap; uniform sampler2D BRDFTexture; -uniform float cubeMips; - uniform vec4 rtParams0; uniform vec4 vsFarPlane; - -uniform float4x4 invViewMat; - +uniform mat4 cameraToWorld; uniform vec3 eyePosWorld; -vec3 iblSpecular(vec3 v, vec3 n, float roughness) +vec3 iblSpecular(in Surface surface, vec3 F) { - vec3 R = reflect(v, n); const float MAX_REFLECTION_LOD = 4.0; - vec3 prefilteredColor = TORQUE_TEXCUBELOD(cubeMap, vec4(R, roughness * MAX_REFLECTION_LOD)).rgb; - vec2 envBRDF = TORQUE_TEX2D(BRDFTexture, vec2(max(dot(n, v), 0.0), roughness)).rg; - return prefilteredColor * (envBRDF.x + envBRDF.y); - //return prefilteredColor; + vec3 prefilteredColor = textureLod(cubeMap, surface.R, surface.roughness * MAX_REFLECTION_LOD).rgb; + vec2 envBRDF = texture(BRDFTexture, vec2(surface.NdotV, surface.roughness)).rg; + return prefilteredColor * (F * envBRDF.x + envBRDF.y); } out vec4 OUT_col; -out vec4 OUT_col1; - void main() { // Compute scene UV - vec3 ssPos = IN.ssPos.xyz / IN.ssPos.w; + vec2 uvScene = getUVFromSSPos( ssPos.xyz/ssPos.w, rtParams0 ); - //vec4 hardCodedRTParams0 = vec4(0,0.0277777780,1,0.972222209); - vec2 uvScene = getUVFromSSPos( ssPos, rtParams0 ); + //eye ray WS/LS + vec3 vsEyeRay = getDistanceVectorToPlane( -vsFarPlane.w, vsEyeDir.xyz, vsFarPlane ); + vec3 wsEyeRay = tMul(cameraToWorld, vec4(vsEyeRay, 0)).xyz; + + //unpack normal and linear depth + vec4 normDepth = deferredUncondition(deferredBuffer, uvScene); + + //create surface + Surface surface = createSurface( normDepth, colorBuffer, matInfoBuffer, + uvScene, eyePosWorld, wsEyeRay, cameraToWorld); - // Matinfo flags - vec4 matInfo = TORQUE_TEX2D( matInfoBuffer, uvScene ); + vec3 F = FresnelSchlickRoughness(surface.NdotV, surface.f0, surface.roughness); + vec3 irradiance = textureLod(irradianceCubemap, surface.N,0).rgb; + vec3 specular = iblSpecular(surface, F); + //energy conservation + vec3 kD = vec3(1.0) - F; + kD *= 1.0 - surface.metalness; + //final diffuse color + vec3 diffuse = kD * irradiance * surface.baseColor.rgb; - // Sample/unpack the normal/z data - vec4 deferredSample = TORQUE_DEFERRED_UNCONDITION( deferredBuffer, uvScene ); - vec3 normal = deferredSample.rgb; - float depth = deferredSample.a; - if (depth>0.9999) - return Output; - - // Need world-space normal. - vec3 wsNormal = mul(vec4(normal, 1), invViewMat).rgb; - - vec3 eyeRay = getDistanceVectorToPlane( -vsFarPlane.w, IN.vsEyeDir.xyz, vsFarPlane ); - - vec3 wsEyeRay = mul(vec4(eyeRay, 1), invViewMat).rgb; - - // Use eye ray to get ws pos - vec3 worldPos = vec3(eyePosWorld + wsEyeRay * depth); - - vec3 reflectionVec = reflect(IN.wsEyeDir, vec4(wsNormal,1)).xyz; - - float roughness = 1 - matInfo.b; - - vec3 v = normalize(eyePosWorld - worldPos); - - vec3 irradiance = TORQUE_TEXCUBE(irradianceCubemap, wsNormal).rgb; - - vec3 specular = iblSpecular(wsEyeRay, wsNormal, roughness); - - - OUT_col = vec4(irradiance.rgb, 1); - OUT_col1 = vec4(specular.rgb, 1); - OUT_col *= matInfo.g; - OUT_col1 *= matInfo.g; + OUT_col = vec4(diffuse + specular * surface.ao, 0); }