Integrated Directional Light.

This commit is contained in:
Anish Bhobe 2025-07-02 15:54:11 +02:00
parent d6907f0503
commit 4c56060260
2 changed files with 56 additions and 15 deletions

View File

@ -202,6 +202,46 @@ float3 GetPointLightInfluence(float3 Albedo, float2 MetalRough, float3 Position,
return Contrib; 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")] [shader("fragment")]
float4 FragmentMain( float4 FragmentMain(
float4 position : POSITION, float4 position : POSITION,
@ -215,22 +255,12 @@ float4 FragmentMain(
float3 N = pcb.material.getNormal(position.xyz, normal.xyz, tangent, texCoord0); float3 N = pcb.material.getNormal(position.xyz, normal.xyz, tangent, texCoord0);
float2 metalRough = pcb.material.getMetalRough(texCoord0); float2 metalRough = pcb.material.getMetalRough(texCoord0);
let albedo = pcb.material.getAlbedo(texCoord0, vertexColor0); float4 albedo = pcb.material.getAlbedo(texCoord0, vertexColor0);
let viewDir = normalize(position.xyz - pfd.camera.position.xyz); float3 viewDir = normalize(position.xyz - pfd.camera.position.xyz);
//float3 f_0 = 0.04f.xxx; float3 pointContrib = GetPointLightInfluence(albedo.rgb, metalRough, position.xyz, N);
//f_0 = lerp(f_0, albedo.rgb, metalRough.x); float3 dirContrib = GetDirectionalLightInfluence(albedo.rgb, metalRough, position.xyz, N);
return float4(pcb.material.getEmissive(texCoord0) + pointContrib + dirContrib, 1.0f);
//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);
} }

View File

@ -76,6 +76,17 @@ SDL_AppResult SDL_AppInit( void** appstate, int, char** )
app_state.renderDevice->bufferManager->WriteToBuffer( app_state.miscData->pointLights, point_light ); 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( memcpy(
app_state.miscData->cameraUniformBufferPtr + sizeof( Blaze::MiscData::CameraData ), app_state.miscData->cameraUniformBufferPtr + sizeof( Blaze::MiscData::CameraData ),
&app_state.miscData->lightData, &app_state.miscData->lightData,