Skip to content

Commit

Permalink
optimize
Browse files Browse the repository at this point in the history
  • Loading branch information
roeas committed Oct 31, 2024
1 parent 639e277 commit 83d35e4
Show file tree
Hide file tree
Showing 11 changed files with 60 additions and 38 deletions.
67 changes: 41 additions & 26 deletions Engine/Asset/Shader/Base_frag.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,16 @@ layout(location = 0) out vec4 o_color;
#include "Shared/Light.h"

#include "Lib/Core.glsl"
#include "Lib/Camera.glsl"
#include "Lib/Material.glsl"
#include "Lib/BRDF.glsl"
#include "Lib/Light.glsl"
#include "Lib/Camera.glsl"

float GetDistanceAttenuation(vec3 uLightDir, float range)
float GetDistanceAttenuation(float distance2, float range)
{
float distance2 = dot(uLightDir, uLightDir);
float attenuation = 1.0 / (max(distance2, 0.01 * 0.01));

// n = 4

float attenuation = 1.0 / (max(distance2, 0.01 * 0.01));
float factor = distance2 / (range * range);
float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);
float smoothDistanceAtt = smoothFactor * smoothFactor;
Expand All @@ -33,66 +32,82 @@ float GetDistanceAttenuation(vec3 uLightDir, float range)
float GetAngleAttenuation(vec3 lightDir, vec3 lightForward, float angleScale, float angleOffset)
{
// On the CPU
// float angleScale = 1.0f / max(0.001f, (cosInner - cosOuter));
// float angleOffset =- cosOuter * angleScale;
float cd = dot(lightDir, lightForward);
// float angleScale = 1.0 / max(0.001, (cosInner - cosOuter));
// float angleOffset = -cosOuter * angleScale;

float cd = dot(lightDir, -lightForward);
float attenuation = clamp(cd * angleScale + angleOffset, 0.0, 1.0);

return attenuation * attenuation;
}

vec3 GetBRDFDirect(vec3 lightDir, vec3 viewDir, Material material)
{
vec3 harfDir = normalize(lightDir + viewDir);
float NdotV = max(dot(material.normal, viewDir), 0.0);
float NdotL = max(dot(material.normal, lightDir), 0.0);
float NdotH = max(dot(material.normal, harfDir), 0.0);
float VdotH = max(dot(viewDir, harfDir), 0.0);

float Dis = DistributionGGX(material.roughness, NdotH);
float Vis = VisibilitySchlick(material.roughness, NdotV, NdotL);
vec3 Fre = FresnelSchlick(material.F0, VdotH);
vec3 KD = mix(vec3(1.0) - Fre, vec3(0.0), material.metallic);

return vec3(Dis) * vec3(Vis) * Fre + KD * material.albedo * vec3(SL_PI_INV);
}

vec3 GetDirectLightContribute(vec3 worldPos, vec3 cameraPos, Material material)
{
vec3 direct = vec3(0.0);
for(uint i = 0; i < ub_lightCount; ++i)
{
Light light = ub_lights[i];

vec3 lightColor = light.color.xyz;
vec3 lightPos = light.position.xyz;
vec3 lightForward = normalize(light.direction.xyz);

vec3 viewDir = normalize(cameraPos - worldPos);
vec3 ulightDir = lightPos - worldPos;
vec3 lightDir = normalize(ulightDir);
vec3 harfDir = normalize(lightDir + viewDir);
float NdotV = max(dot(material.normal, viewDir), 0.0);
vec3 viewDir = normalize(cameraPos - worldPos);
float NdotL = max(dot(material.normal, lightDir), 0.0);
float NdotH = max(dot(material.normal, harfDir), 0.0);
float VdotH = max(dot(viewDir, harfDir), 0.0);

float Dis = DistributionGGX(material.roughness, NdotH);
float Vis = VisibilitySchlick(material.roughness, NdotV, NdotL);
vec3 Fre = FresnelSchlick(material.F0, VdotH);
vec3 KD = mix(vec3(1.0) - Fre, vec3(0.0), material.metallic);
vec3 BRDF = vec3(Dis) * vec3(Vis) * Fre + KD * material.albedo * vec3(SL_PI_INV);
float distance2 = dot(ulightDir, ulightDir);
float distanceAttenuation = GetDistanceAttenuation(distance2, light.range);
float angleAttenuation = GetAngleAttenuation(lightDir, lightForward, light.scale, light.offset);

if(light.type == LIGHT_TYPE_DIRECTIONAL)
{
// L_out = f * E * cosTheta
direct += BRDF * light.intensity * max(dot(material.normal, -lightForward), 0.0);

lightDir = -lightForward;
NdotL = max(dot(material.normal, lightDir), 0.0);
vec3 BRDF = GetBRDFDirect(lightDir, viewDir, material);

direct += BRDF * lightColor * light.intensity * NdotL;
}
else if(light.type == LIGHT_TYPE_POINT)
{
// I = Phi / 4Pi
// L_out = f * L_in * cosTheta

vec3 BRDF = GetBRDFDirect(lightDir, viewDir, material);
float I = light.intensity * 0.25 * SL_PI_INV;
float attenuation = GetDistanceAttenuation(ulightDir, light.range);
float L = I * attenuation;
float L = I * distanceAttenuation;

direct += BRDF * L * NdotL;
direct += BRDF * lightColor * L * NdotL;
}
else if(light.type == LIGHT_TYPE_SPOT)
{
// I = Phi / Pi
// L_out = f * L_in * cosTheta

vec3 BRDF = GetBRDFDirect(lightDir, viewDir, material);
float I = light.intensity * SL_PI_INV;
float attenuation = GetDistanceAttenuation(ulightDir, light.range);
attenuation *= GetAngleAttenuation(lightDir, lightForward, light.scale, light.offset);
float L = I * attenuation;
float L = I * distanceAttenuation * angleAttenuation;

direct += BRDF * L * NdotL;
direct += BRDF * lightColor * L * NdotL;
}
}

Expand Down
1 change: 0 additions & 1 deletion Engine/Source/Editor/Layer/ImGuiLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
#include "Window/Input.h"
#include "Window/Window.h"

#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <imgui/imgui.h>
#include <imguizmo/ImGuizmo.h>
Expand Down
2 changes: 1 addition & 1 deletion Engine/Source/Editor/Layer/RendererLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ void RendererLayer::OnRender()
}
if (auto *pLightUniformBuffer = sl::RenderCore::GetUniformBuffer("LightUniformBuffer"); pLightUniformBuffer)
{
pLightUniformBuffer->Upload("ub_lights", lightGPUData.data());
pLightUniformBuffer->Upload("ub_lights", lightGPUData.data(), lightCount * sizeof(sl::LightUniformBuffer));
pLightUniformBuffer->Upload("ub_lightCount", &lightCount);
}

Expand Down
2 changes: 0 additions & 2 deletions Engine/Source/Editor/Layer/SandboxLayer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
#include "Scene/ECSWorld.h"
#include "Utils/ProfilerCPU.h"

#include <glm/glm.hpp>

SandboxLayer::SandboxLayer()
{
SL_PROFILE;
Expand Down
11 changes: 9 additions & 2 deletions Engine/Source/Engine/Platform/OpenGL/OpenGLUniformBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,13 +34,20 @@ void OpenGLUniformBuffer::Unbind() const
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}

void OpenGLUniformBuffer::Upload(std::string_view name, const void *pData) const
void OpenGLUniformBuffer::Upload(std::string_view name, const void *pData, uint32_t size) const
{
const auto &optElement = m_layout.GetElement(name);
if (optElement)
{
if (size > optElement->m_size)
{
SL_LOG_ERROR("Uniform buffer {} update size out of range!", name.data());
return;
}
uint32_t updateSize = size > 0 ? size : optElement->m_size;

glBindBuffer(GL_UNIFORM_BUFFER, m_handle);
glBufferSubData(GL_UNIFORM_BUFFER, optElement->m_offset, optElement->m_size, pData);
glBufferSubData(GL_UNIFORM_BUFFER, optElement->m_offset, updateSize, pData);
glBindBuffer(GL_UNIFORM_BUFFER, 0);
}
else
Expand Down
2 changes: 1 addition & 1 deletion Engine/Source/Engine/Platform/OpenGL/OpenGLUniformBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ class OpenGLUniformBuffer : public UniformBuffer
virtual void Bind() const override;
virtual void Unbind() const override;

virtual void Upload(std::string_view name, const void *pData) const override;
virtual void Upload(std::string_view name, const void *pData, uint32_t size = 0) const override;

private:
UniformBufferLayout m_layout;
Expand Down
2 changes: 1 addition & 1 deletion Engine/Source/Engine/RenderCore/UniformBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class UniformBuffer
virtual void Bind() const = 0;
virtual void Unbind() const = 0;

virtual void Upload(std::string_view name, const void *pData) const = 0;
virtual void Upload(std::string_view name, const void *pData, uint32_t size = 0) const = 0;
};

} // namespace sl
3 changes: 2 additions & 1 deletion Engine/Source/Engine/Resource/MaterialResource.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#include "Asset/Shader/Shared/PBRMaterial.h"
#include "Resource/Resource.h"

#include <glm/glm.hpp>
#include <glm/vec2.hpp>
#include <glm/vec3.hpp>

#include <memory>
#include <string>
Expand Down
2 changes: 1 addition & 1 deletion Engine/Source/Engine/Resource/ModelImporter.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

#include "Scene/ECSWorld.h"

#include <glm/glm.hpp>
#include <glm/vec3.hpp>

#include <cstdint>
#include <string>
Expand Down
3 changes: 2 additions & 1 deletion Engine/Source/Engine/Scene/LightComponent.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

#include "Asset/Shader/Shared/Light.h"

#include <glm/glm.hpp>
#include <glm/vec3.hpp>
#include <glm/vec4.hpp>

#include <cstdint>

Expand Down
3 changes: 2 additions & 1 deletion Engine/Source/Engine/Window/Window.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

#include "Event/Event.h"

#include <glm/glm.hpp>
#include <glm/vec2.hpp>

#include <memory>

struct SDL_WindowEvent;
Expand Down

0 comments on commit 83d35e4

Please sign in to comment.