summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Render.cpp2
-rw-r--r--src/RenderConfigs.cpp105
-rw-r--r--src/RenderConfigs.hpp14
3 files changed, 66 insertions, 55 deletions
diff --git a/src/Render.cpp b/src/Render.cpp
index 1095148..1e85437 100644
--- a/src/Render.cpp
+++ b/src/Render.cpp
@@ -140,7 +140,7 @@ void Render::PrepareToRendering() {
float resolutionScale = Settings::ReadDouble("resolutionScale", 1.0f);
size_t scaledW = width * resolutionScale, scaledH = height * resolutionScale;
- gbuffer = std::make_unique<Gbuffer>(scaledW, scaledH, scaledW, scaledH);
+ gbuffer = std::make_unique<Gbuffer>(scaledW, scaledH, scaledW, scaledH, Settings::ReadBool("ssao", false));
gbuffer->SetRenderBuff(renderBuff);
auto gal = Gal::GetImplementation();
diff --git a/src/RenderConfigs.cpp b/src/RenderConfigs.cpp
index 88166a5..0a5450b 100644
--- a/src/RenderConfigs.cpp
+++ b/src/RenderConfigs.cpp
@@ -80,7 +80,7 @@ PostProcess::PostProcess(
});
}
-Gbuffer::Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH) {
+Gbuffer::Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH, bool applySsao) {
auto gal = Gal::GetImplementation();
auto colorConf = gal->CreateTexture2DConfig(geomW, geomH, Gal::Format::R8G8B8);
@@ -124,57 +124,60 @@ Gbuffer::Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH) {
geomFramebuffer = gal->BuildFramebuffer(geomFbConf);
geomFramebuffer->SetViewport(0, 0, geomW, geomH);
- auto noiseConf = gal->CreateTexture2DConfig(4, 4, Gal::Format::R32G32B32A32F);
- noiseConf->SetWrapping(Gal::Wrapping::Repeat);
- noiseConf->SetMinFilter(Gal::Filtering::Bilinear);
- noiseConf->SetMaxFilter(Gal::Filtering::Bilinear);
- ssaoNoise = gal->BuildTexture(noiseConf);
-
- std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
- std::uniform_real_distribution<> dis(-1.0f, 1.0f);
- std::vector<glm::vec4> noiseTexData(16);
- for (auto& vec : noiseTexData) {
- vec.x = dis(rng);
- vec.y = dis(rng);
- vec.z = 0.0f;
- vec.w = 0.0f;
+ if (applySsao) {
+ auto noiseConf = gal->CreateTexture2DConfig(4, 4, Gal::Format::R32G32B32A32F);
+ noiseConf->SetWrapping(Gal::Wrapping::Repeat);
+ noiseConf->SetMinFilter(Gal::Filtering::Bilinear);
+ noiseConf->SetMaxFilter(Gal::Filtering::Bilinear);
+ ssaoNoise = gal->BuildTexture(noiseConf);
+
+ std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
+ std::uniform_real_distribution<> dis(-1.0f, 1.0f);
+ std::vector<glm::vec4> noiseTexData(16);
+ for (auto& vec : noiseTexData) {
+ vec.x = dis(rng);
+ vec.y = dis(rng);
+ vec.z = 0.0f;
+ vec.w = 0.0f;
+ }
+ ssaoNoise->SetData({ reinterpret_cast<std::byte*>(noiseTexData.data()), reinterpret_cast<std::byte*>(noiseTexData.data() + noiseTexData.size()) });
+
+ std::vector<std::pair<std::string_view, std::shared_ptr<Gal::Texture>>> ssaoTextures = {
+ {"normal", normal},
+ {"worldPos", worldPos},
+ {"ssaoNoise", ssaoNoise},
+ };
+
+ ssaoPass = std::make_unique<PostProcess>(LoadPixelShader("/altcraft/shaders/frag/ssao"),
+ ssaoTextures,
+ std::vector<std::pair<std::string_view, Gal::Type>>{},
+ lightW,
+ lightH,
+ Gal::Format::R8G8B8A8,
+ Gal::Filtering::Bilinear);
+
+ std::vector<std::pair<std::string_view, std::shared_ptr<Gal::Texture>>> ssaoBlurTextures = {
+ {"blurInput", ssaoPass->GetResultTexture()},
+ };
+
+ std::vector<std::pair<std::string_view, Gal::Type>> ssaoBlurParameters = {
+ {"blurScale", Gal::Type::Int32},
+ };
+
+ ssaoBlurPass = std::make_unique<PostProcess>(LoadPixelShader("/altcraft/shaders/frag/blur"),
+ ssaoBlurTextures,
+ ssaoBlurParameters,
+ lightW,
+ lightH,
+ Gal::Format::R8G8B8A8,
+ Gal::Filtering::Bilinear);
+
+ ssaoBlurPass->SetShaderParameter("blurScale", 2);
}
- ssaoNoise->SetData({ reinterpret_cast<std::byte*>(noiseTexData.data()), reinterpret_cast<std::byte*>(noiseTexData.data() + noiseTexData.size()) });
-
- std::vector<std::pair<std::string_view, std::shared_ptr<Gal::Texture>>> ssaoTextures = {
- {"normal", normal},
- {"worldPos", worldPos},
- {"ssaoNoise", ssaoNoise},
- };
-
- ssaoPass = std::make_unique<PostProcess>(LoadPixelShader("/altcraft/shaders/frag/ssao"),
- ssaoTextures,
- std::vector<std::pair<std::string_view, Gal::Type>>{},
- lightW,
- lightH,
- Gal::Format::R8G8B8A8,
- Gal::Filtering::Bilinear);
-
- std::vector<std::pair<std::string_view, std::shared_ptr<Gal::Texture>>> ssaoBlurTextures = {
- {"blurInput", ssaoPass->GetResultTexture()},
- };
-
- std::vector<std::pair<std::string_view, Gal::Type>> ssaoBlurParameters = {
- {"blurScale", Gal::Type::Int32},
- };
-
- ssaoBlurPass = std::make_unique<PostProcess>(LoadPixelShader("/altcraft/shaders/frag/blur"),
- ssaoBlurTextures,
- ssaoBlurParameters,
- lightW,
- lightH,
- Gal::Format::R8G8B8A8,
- Gal::Filtering::Bilinear);
-
- ssaoBlurPass->SetShaderParameter("blurScale", 2);
std::vector<std::pair<std::string_view, Gal::Type>> lightingParameters = {
{"renderBuff", Gal::Type::Int32},
+ {"applySsao", Gal::Type::Int32},
};
std::vector<std::pair<std::string_view, std::shared_ptr<Gal::Texture>>> lightingTextures = {
@@ -184,9 +187,11 @@ Gbuffer::Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH) {
{"worldPos", worldPos},
{"addColor", addColor},
{"light", light},
- {"ssao", ssaoBlurPass->GetResultTexture()},
};
+ if (applySsao)
+ lightingTextures.emplace_back("ssao", ssaoBlurPass->GetResultTexture());
+
lightingPass = std::make_unique<PostProcess>(LoadPixelShader("/altcraft/shaders/frag/light"),
lightingTextures,
lightingParameters,
@@ -194,4 +199,6 @@ Gbuffer::Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH) {
lightH,
Gal::Format::R8G8B8A8,
Gal::Filtering::Bilinear);
+
+ lightingPass->SetShaderParameter("applySsao", true);
}
diff --git a/src/RenderConfigs.hpp b/src/RenderConfigs.hpp
index 0667bbe..a9b8d72 100644
--- a/src/RenderConfigs.hpp
+++ b/src/RenderConfigs.hpp
@@ -73,7 +73,7 @@ class Gbuffer {
std::shared_ptr<Gal::Framebuffer> geomFramebuffer;
public:
- Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH);
+ Gbuffer(size_t geomW, size_t geomH, size_t lightW, size_t lightH, bool applySsao);
std::shared_ptr<Gal::Framebuffer> GetGeometryTarget() {
return geomFramebuffer;
@@ -84,15 +84,19 @@ public:
}
void Render() {
- ssaoPass->Render();
- ssaoBlurPass->Render();
+ if (ssaoPass) {
+ ssaoPass->Render();
+ ssaoBlurPass->Render();
+ }
lightingPass->Render();
}
void Clear() {
geomFramebuffer->Clear();
- ssaoPass->Clear();
- ssaoBlurPass->Clear();
+ if (ssaoPass) {
+ ssaoPass->Clear();
+ ssaoBlurPass->Clear();
+ }
lightingPass->Clear();
}