diff --git a/res/shaders/lib/BRDF.slang b/res/shaders/lib/BRDF.slang index 4ea454f..938019a 100644 --- a/res/shaders/lib/BRDF.slang +++ b/res/shaders/lib/BRDF.slang @@ -23,14 +23,14 @@ struct BlinnPhong : IBRDF sheen = 1; } - float3 evaluate(float3x3 tbn, float3 viewDir_WS, float3 lightDir_WS, float3 lightColor) + float3 evaluate(float3x3 tbn, float3 viewDir_TS, float3 lightDir_TS, float3 lightColor) { - float3 normal_WS = mul(normal, tbn); - float diffuse = max(dot(normal_WS, lightDir_WS), 0); - float3 h = lightDir_WS + viewDir_WS; - float specular = dot(normal_WS, h); + float3 normal_TS = normalize(normal); + float diffuse = max(dot(normal_TS, lightDir_TS), 0); + float3 h = normalize(lightDir_TS + viewDir_TS); + float specular = saturate(dot(normal_TS, h)); - return (viewDir_WS + float3(1, 1, 1)) / 2;//baseColor * (diffuse + specular) * lightColor; + return baseColor * (diffuse + specular) * lightColor; } }; diff --git a/res/shaders/lib/LightEnv.slang b/res/shaders/lib/LightEnv.slang index 174e74a..8e3cc68 100644 --- a/res/shaders/lib/LightEnv.slang +++ b/res/shaders/lib/LightEnv.slang @@ -14,7 +14,8 @@ struct DirectionalLight : ILightEnv float3 illuminate(LightingParameter params, B brdf) { - return brdf.evaluate(params.tbn, params.viewDir_WS, -normalize(direction.xyz), color.xyz); + float3 lightDir_TS = mul(params.tbn, direction.xyz); + return brdf.evaluate(params.tbn, params.viewDir_TS, -normalize(lightDir_TS), color.xyz); } }; @@ -26,9 +27,10 @@ struct PointLight : ILightEnv float3 illuminate(LightingParameter params, B brdf) { float3 lightDir_WS = position_WS.xyz - params.position_WS; - float d = length(lightDir_WS); + float3 lightDir_TS = mul(params.tbn, lightDir_WS); + float d = length(lightDir_TS); float illuminance = max(1 - d / colorRange.w, 0); - return brdf.evaluate(params.tbn, params.viewDir_WS, normalize(lightDir_WS), colorRange.xyz); + return brdf.evaluate(params.tbn, params.viewDir_TS, normalize(lightDir_TS), colorRange.xyz); } bool insidePlane(Plane plane) diff --git a/res/shaders/lib/MaterialParameter.slang b/res/shaders/lib/MaterialParameter.slang index 1e52a9b..9cc5208 100644 --- a/res/shaders/lib/MaterialParameter.slang +++ b/res/shaders/lib/MaterialParameter.slang @@ -12,7 +12,7 @@ struct LightingParameter { float3x3 tbn; float3 position_WS; - float3 viewDir_WS; + float3 viewDir_TS; }; // data passed to fragment shader @@ -39,7 +39,7 @@ struct FragmentParameter LightingParameter result; result.tbn = float3x3(normalize(tangent_WS), normalize(biTangent_WS), normalize(normal_WS)); result.position_WS = position_WS; - result.viewDir_WS = normalize(viewDir_WS); + result.viewDir_TS = normalize(mul(result.tbn, viewDir_WS)); return result; } }; diff --git a/src/Engine/Component/Camera.h b/src/Engine/Component/Camera.h index dffec60..788e17d 100644 --- a/src/Engine/Component/Camera.h +++ b/src/Engine/Component/Camera.h @@ -21,7 +21,7 @@ struct Camera } Vector getCameraPosition() const { - return -viewMatrix[3]; + return cameraPos; } void mouseMove(float deltaX, float deltaY); void mouseScroll(float x);