Skip to content

Commit

Permalink
Post-Processing Volumes (#39)
Browse files Browse the repository at this point in the history
  • Loading branch information
fszewczyk authored Feb 12, 2025
1 parent 87106a5 commit ef42996
Show file tree
Hide file tree
Showing 18 changed files with 452 additions and 133 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
18 changes: 18 additions & 0 deletions resources/shaders/fragment/gamma_correction.glsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#version 330 core

uniform sampler2D original;
uniform float gamma;

// ******** TRANSFORMATION DATA ********
out vec4 FragColor;
in vec2 TexCoords;

vec3 gammaCorrection(vec3 color)
{
return pow(color, vec3(1.0 / gamma));
}

void main() {
vec3 color = gammaCorrection(texture(original, TexCoords).rgb);
FragColor = vec4(color, 1.0);
}
6 changes: 0 additions & 6 deletions resources/shaders/fragment/tonemapping_aces.glsl
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,8 @@ vec3 toneMappingACES(vec3 color) {
return (color * (a * color + b)) / (color * (c * color + d) + e);
}

vec3 gammaCorrection(vec3 color)
{
return pow(color, vec3(1.0 / 1.2));
}

void main() {
// Lighting
vec3 color = toneMappingACES(texture(original, TexCoords).rgb);
color = gammaCorrection(color);
FragColor = vec4(color, 1.0);
}
1 change: 1 addition & 0 deletions src/Components/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ add_library(
${CMAKE_CURRENT_LIST_DIR}/SpotLightComponent.hpp
${CMAKE_CURRENT_LIST_DIR}/PointLightComponent.hpp
${CMAKE_CURRENT_LIST_DIR}/DirectionalLightComponent.hpp
${CMAKE_CURRENT_LIST_DIR}/PostProcessingVolumeComponent.hpp
${CMAKE_CURRENT_LIST_DIR}/AmbientLightComponent.hpp
${CMAKE_CURRENT_LIST_DIR}/BoxColliderComponent.hpp
${CMAKE_CURRENT_LIST_DIR}/SkyboxComponent.hpp
Expand Down
14 changes: 14 additions & 0 deletions src/Components/PostProcessingVolumeComponent.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once

namespace shkyera {

struct PostProcessingVolumeComponent
{
float gamma{1.2};
bool toneMapping{true};
bool antiAliasing{true};
bool bloom{true};
bool global{false};
};

}
12 changes: 12 additions & 0 deletions src/Math/AABB.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,4 +50,16 @@ std::optional<float> AABB::intersect(const Ray& ray, const glm::mat4& transform)
return tMin;
}

bool AABB::isInside(const glm::mat4& aabbTransformMatrix, const glm::vec3& point) const {
glm::mat4 invTransform = glm::inverse(aabbTransformMatrix);
glm::vec3 localPoint = glm::vec3(invTransform * glm::vec4(point, 1.0f));

glm::vec3 minBound = center - extents;
glm::vec3 maxBound = center + extents;

return (localPoint.x >= minBound.x && localPoint.x <= maxBound.x) &&
(localPoint.y >= minBound.y && localPoint.y <= maxBound.y) &&
(localPoint.z >= minBound.z && localPoint.z <= maxBound.z);
}

} // namespace shkyera
1 change: 1 addition & 0 deletions src/Math/AABB.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ struct AABB {
glm::vec3 extents;

std::optional<float> intersect(const Ray& ray, const glm::mat4& transform) const;
bool isInside(const glm::mat4& aabbTransformMatrix, const glm::vec3& point) const;
};

} // namespace shkyera
37 changes: 28 additions & 9 deletions src/Rendering/ShaderProgram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

namespace shkyera {

ShaderProgram::ShaderProgram() : _inUse(false) {
ShaderProgram::ShaderProgram() {
_id = glCreateProgram();
}

Expand All @@ -28,18 +28,23 @@ void ShaderProgram::link() {
}
}

bool ShaderProgram::isInUse()
{
return !_shadersInUse.empty() && _id == _shadersInUse.top();
}

void ShaderProgram::use() {
_shadersInUse.push(_id);
glUseProgram(_id);
_inUse = true;
}

void ShaderProgram::stopUsing() {
glUseProgram(0);
_inUse = false;
_shadersInUse.pop();
glUseProgram(_shadersInUse.empty() ? 0 : _shadersInUse.top());
}

void ShaderProgram::setUniform(const std::string& name, int value) {
if(!_inUse) {
if(!isInUse()) {
Logger::ERROR("Trying to set a uniform (" + name + ") while the shader program is not in use.");
}

Expand All @@ -52,7 +57,7 @@ void ShaderProgram::setUniform(const std::string& name, int value) {
}

void ShaderProgram::setUniform(const std::string& name, float value) {
if(!_inUse) {
if(!isInUse()) {
Logger::ERROR("Trying to set a uniform (" + name + ") while the shader program is not in use.");
}

Expand All @@ -65,7 +70,7 @@ void ShaderProgram::setUniform(const std::string& name, float value) {
}

void ShaderProgram::setUniform(const std::string& name, const glm::vec2& value) {
if(!_inUse) {
if(!isInUse()) {
Logger::ERROR("Trying to set a uniform (" + name + ") while the shader program is not in use.");
}

Expand All @@ -78,7 +83,7 @@ void ShaderProgram::setUniform(const std::string& name, const glm::vec2& value)
}

void ShaderProgram::setUniform(const std::string& name, const glm::vec3& value) {
if(!_inUse) {
if(!isInUse()) {
Logger::ERROR("Trying to set a uniform (" + name + ") while the shader program is not in use.");
}

Expand All @@ -91,7 +96,7 @@ void ShaderProgram::setUniform(const std::string& name, const glm::vec3& value)
}

void ShaderProgram::setUniform(const std::string& name, const glm::mat4& value) {
if(!_inUse) {
if(!isInUse()) {
Logger::ERROR("Trying to set a uniform (" + name + ") while the shader program is not in use.");
}

Expand All @@ -118,4 +123,18 @@ GLint ShaderProgram::getUniformLocation(const std::string& name) {
return location;
}

UseShader::UseShader(ShaderProgram& shaderProgram) : mShaderProgram(shaderProgram)
{
Logger::INFO("Using!");
mShaderProgram.use();
}


UseShader::~UseShader()
{
Logger::INFO("STOP Using!");
mShaderProgram.stopUsing();
}


}
14 changes: 13 additions & 1 deletion src/Rendering/ShaderProgram.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <memory>
#include <string>
#include <stack>
#include <unordered_map>

#include <AssetManager/Shader.hpp>
Expand All @@ -30,12 +31,23 @@ class ShaderProgram {
void setUniform(const std::string& name, const glm::mat4& value);

private:
bool isInUse();
GLint getUniformLocation(const std::string& name);

bool _inUse;
GLuint _id; // OpenGL shader program ID
std::unordered_map<std::string, GLint> _uniformLocationCache;

inline static std::stack<GLuint> _shadersInUse{};
};

class UseShader
{
public:
UseShader(ShaderProgram& shaderProgram);
~UseShader();

private:
ShaderProgram& mShaderProgram;
};

}
3 changes: 1 addition & 2 deletions src/Rendering/Utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ void applyShaderToFrameBuffer(
{
// Bind framebuffer and activate shader program
frameBuffer.bind();
shaderProgram.use();
UseShader shaderUsage(shaderProgram);

// Bind textures to their corresponding texture units
int textureIndex = 0;
Expand All @@ -40,7 +40,6 @@ void applyShaderToFrameBuffer(
utils::drawFullscreenQuad();

// Stop using the shader program and unbind framebuffer
shaderProgram.stopUsing();
frameBuffer.unbind();
}

Expand Down
Loading

0 comments on commit ef42996

Please sign in to comment.