Integrated Directional Light.
This commit is contained in:
parent
d6907f0503
commit
74634a2a5e
|
|
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue