From 4c560602604db40542b4c4beff9259025e882f94 Mon Sep 17 00:00:00 2001 From: Anish Bhobe Date: Wed, 2 Jul 2025 15:54:11 +0200 Subject: [PATCH] Integrated Directional Light. --- Blaze/Assets/Shaders/Mesh.slang | 60 ++++++++++++++++++++++++--------- Blaze/Source/Blaze.cpp | 11 ++++++ 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/Blaze/Assets/Shaders/Mesh.slang b/Blaze/Assets/Shaders/Mesh.slang index e3ac5b6..f20dd64 100644 --- a/Blaze/Assets/Shaders/Mesh.slang +++ b/Blaze/Assets/Shaders/Mesh.slang @@ -202,6 +202,46 @@ float3 GetPointLightInfluence(float3 Albedo, float2 MetalRough, float3 Position, return Contrib; } +float3 GetDirectionalLightInfluence(float3 Albedo, float2 MetalRough, float3 Position, float3 Normal) +{ + if (pfd.lightData.dirLightCount == 0) + return 0.0f.xxx; + + float3 ViewDir = normalize(pfd.camera.position.xyz - Position); + + float Metallic = MetalRough.r; + float Roughness = MetalRough.g; + + // Dielectric F_0 based on LearnOpenGL. + // TODO: Cite + float3 F_0 = 0.04f.xxx; + F_0 = lerp(F_0, Albedo, Metallic); + + float3 Contrib = 0.0f; + for (uint i = 0; i < pfd.lightData.dirLightCount; ++i) + { + DirectionalLight Light = pfd.lightData.dirLights[i]; + + if (Light._padding0 < 0.0f) + continue; + + float3 LightDir = -normalize(Light.direction); + + // Color Unpack + //float R = (Light.Color & 0xFF000000) >> 24; + //float G = (Light.Color & 0x00FF0000) >> 16; + //float B = (Light.Color & 0x0000FF00) >> 8; + + //float3 LightColor = Light.Intensity * float3(R, G, B) * 0.00392156862f; // 0.00392156862 = 1/255 + + float3 LightColor = Light.color; + + Contrib += GetPBRContrib(Albedo, LightColor, ViewDir, Normal, Metallic, Roughness, F_0, LightDir, 1.0f); + } + + return Contrib; +} + [shader("fragment")] float4 FragmentMain( float4 position : POSITION, @@ -215,22 +255,12 @@ float4 FragmentMain( float3 N = pcb.material.getNormal(position.xyz, normal.xyz, tangent, texCoord0); float2 metalRough = pcb.material.getMetalRough(texCoord0); - let albedo = pcb.material.getAlbedo(texCoord0, vertexColor0); - let viewDir = normalize(position.xyz - pfd.camera.position.xyz); + float4 albedo = pcb.material.getAlbedo(texCoord0, vertexColor0); + float3 viewDir = normalize(position.xyz - pfd.camera.position.xyz); - //float3 f_0 = 0.04f.xxx; - //f_0 = lerp(f_0, albedo.rgb, metalRough.x); + float3 pointContrib = GetPointLightInfluence(albedo.rgb, metalRough, position.xyz, N); + float3 dirContrib = GetDirectionalLightInfluence(albedo.rgb, metalRough, position.xyz, N); - - //float3 contrib = 0.0f.xxx; - //for (uint i = 0; i < pfd.lightData.pointLightCount; ++i) { - // PointLight pointlight = pfd.lightData.pointLights[i]; - - // contrib += pointlight.getInfluence(albedo.rgb, metalRough, viewDir, position.xyz, N, f_0); - //} - - let contrib = GetPointLightInfluence(albedo.rgb, metalRough, position.xyz, N); - - return float4(pcb.material.getEmissive(texCoord0) + contrib, 1.0f); + return float4(pcb.material.getEmissive(texCoord0) + pointContrib + dirContrib, 1.0f); } diff --git a/Blaze/Source/Blaze.cpp b/Blaze/Source/Blaze.cpp index 9c338f2..6391f27 100644 --- a/Blaze/Source/Blaze.cpp +++ b/Blaze/Source/Blaze.cpp @@ -76,6 +76,17 @@ SDL_AppResult SDL_AppInit( void** appstate, int, char** ) app_state.renderDevice->bufferManager->WriteToBuffer( app_state.miscData->pointLights, point_light ); + Blaze::MiscData::DirectionalLight dir_light[] = { + { + .direction = { 1.0f, -1.0f, 0.0f }, + .color = { 12.0f, 10.0f, 5.0f }, + }, + }; + + app_state.miscData->lightData.dirLightCount = _countof( dir_light ); + + app_state.renderDevice->bufferManager->WriteToBuffer( app_state.miscData->directionalLights, dir_light ); + memcpy( app_state.miscData->cameraUniformBufferPtr + sizeof( Blaze::MiscData::CameraData ), &app_state.miscData->lightData,