Skip to content

Commit

Permalink
- change tonemaps to steps
Browse files Browse the repository at this point in the history
  • Loading branch information
dpjudas committed Jun 23, 2018
1 parent ebf0cef commit b2fad45
Show file tree
Hide file tree
Showing 9 changed files with 114 additions and 182 deletions.
1 change: 0 additions & 1 deletion src/CMakeLists.txt
Expand Up @@ -1068,7 +1068,6 @@ set (PCH_SOURCES
hwrenderer/postprocessing/hw_presentshader.cpp
hwrenderer/postprocessing/hw_present3dRowshader.cpp
hwrenderer/postprocessing/hw_ambientshader.cpp
hwrenderer/postprocessing/hw_tonemapshader.cpp
hwrenderer/textures/hw_material.cpp
hwrenderer/textures/hw_precache.cpp
hwrenderer/utility/hw_clock.cpp
Expand Down
80 changes: 11 additions & 69 deletions src/gl/renderer/gl_postprocess.cpp
Expand Up @@ -40,7 +40,6 @@
#include "gl/renderer/gl_postprocessstate.h"
#include "gl/data/gl_vertexbuffer.h"
#include "hwrenderer/postprocessing/hw_ambientshader.h"
#include "hwrenderer/postprocessing/hw_tonemapshader.h"
#include "hwrenderer/postprocessing/hw_presentshader.h"
#include "hwrenderer/postprocessing/hw_postprocess.h"
#include "hwrenderer/postprocessing/hw_postprocess_cvars.h"
Expand Down Expand Up @@ -101,10 +100,13 @@ void FGLRenderBuffers::RenderEffect(const FString &name)

if (!gltexture)
{
gltexture = Create2DTexture(name.GetChars(), glformat, pair->Value.Width, pair->Value.Height);
if (pair->Value.Data)
gltexture = Create2DTexture(pair->Key.GetChars(), glformat, pair->Value.Width, pair->Value.Height, pair->Value.Data.get());
else
gltexture = Create2DTexture(pair->Key.GetChars(), glformat, pair->Value.Width, pair->Value.Height);
gltexture.Width = pair->Value.Width;
gltexture.Height = pair->Value.Height;
glframebuffer = CreateFrameBuffer(name.GetChars(), gltexture);
glframebuffer = CreateFrameBuffer(pair->Key.GetChars(), gltexture);
}
}
}
Expand Down Expand Up @@ -378,76 +380,16 @@ void FGLRenderer::BlurScene(float gameinfobluramount)

void FGLRenderer::TonemapScene()
{
if (gl_tonemap == 0)
return;

FGLDebug::PushGroup("TonemapScene");

CreateTonemapPalette();

FGLPostProcessState savedState;
savedState.SaveTextureBindings(2);

mBuffers->BindNextFB();
mBuffers->BindCurrentTexture(0);
mTonemapShader->Bind(NOQUEUE);

if (mTonemapShader->IsPaletteMode())
{
glActiveTexture(GL_TEXTURE2);
glBindTexture(GL_TEXTURE_2D, mTonemapPalette->GetTextureHandle(0));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glActiveTexture(GL_TEXTURE0);
}
else
{
//mBuffers->ExposureTexture.Bind(1);
}

RenderScreenQuad();
mBuffers->NextTexture();

FGLDebug::PopGroup();
}

void FGLRenderer::CreateTonemapPalette()
{
if (!mTonemapPalette)
{
TArray<unsigned char> lut;
lut.Resize(512 * 512 * 4);
for (int r = 0; r < 64; r++)
{
for (int g = 0; g < 64; g++)
{
for (int b = 0; b < 64; b++)
{
PalEntry color = GPalette.BaseColors[(uint8_t)PTM_BestColor((uint32_t *)GPalette.BaseColors, (r << 2) | (r >> 4), (g << 2) | (g >> 4), (b << 2) | (b >> 4),
gl_paltonemap_reverselookup, gl_paltonemap_powtable, 0, 256)];
int index = ((r * 64 + g) * 64 + b) * 4;
lut[index] = color.b;
lut[index + 1] = color.g;
lut[index + 2] = color.r;
lut[index + 3] = 255;
}
}
}

mTonemapPalette = new FHardwareTexture(true);
mTonemapPalette->CreateTexture(&lut[0], 512, 512, 0, false, 0, "mTonemapPalette");
}
PPTonemap tonemap;
tonemap.DeclareShaders();
tonemap.UpdateTextures();
tonemap.UpdateSteps();
mBuffers->RenderEffect("TonemapScene");
}

void FGLRenderer::ClearTonemapPalette()
{
if (mTonemapPalette)
{
delete mTonemapPalette;
mTonemapPalette = nullptr;
}
hw_postprocess.Textures.Remove("Tonemap.Palette");
}

void FGLRenderer::ColormapScene(int fixedcm)
Expand Down
8 changes: 0 additions & 8 deletions src/gl/renderer/gl_renderer.cpp
Expand Up @@ -51,7 +51,6 @@
#include "gl/scene/gl_drawinfo.h"
#include "gl/scene/gl_scenedrawer.h"
#include "hwrenderer/postprocessing/hw_ambientshader.h"
#include "hwrenderer/postprocessing/hw_tonemapshader.h"
#include "hwrenderer/postprocessing/hw_presentshader.h"
#include "hwrenderer/postprocessing/hw_present3dRowshader.h"
#include "hwrenderer/postprocessing/hw_shadowmapshader.h"
Expand Down Expand Up @@ -90,16 +89,13 @@ FGLRenderer::FGLRenderer(OpenGLFrameBuffer *fb)
mSkyVBO = nullptr;
mShaderManager = nullptr;
mLights = nullptr;
mTonemapPalette = nullptr;
mBuffers = nullptr;
mScreenBuffers = nullptr;
mSaveBuffers = nullptr;
mPresentShader = nullptr;
mPresent3dCheckerShader = nullptr;
mPresent3dColumnShader = nullptr;
mPresent3dRowShader = nullptr;
mTonemapShader = nullptr;
mTonemapPalette = nullptr;
mLinearDepthShader = nullptr;
mDepthBlurShader = nullptr;
mSSAOShader = nullptr;
Expand All @@ -117,8 +113,6 @@ void FGLRenderer::Initialize(int width, int height)
mDepthBlurShader = new FDepthBlurShader();
mSSAOShader = new FSSAOShader();
mSSAOCombineShader = new FSSAOCombineShader();
mTonemapShader = new FTonemapShader();
mTonemapPalette = nullptr;
mPresentShader = new FPresentShader();
mPresent3dCheckerShader = new FPresent3DCheckerShader();
mPresent3dColumnShader = new FPresent3DColumnShader();
Expand Down Expand Up @@ -173,8 +167,6 @@ FGLRenderer::~FGLRenderer()
if (mPresent3dCheckerShader) delete mPresent3dCheckerShader;
if (mPresent3dColumnShader) delete mPresent3dColumnShader;
if (mPresent3dRowShader) delete mPresent3dRowShader;
if (mTonemapShader) delete mTonemapShader;
if (mTonemapPalette) delete mTonemapPalette;
if (mShadowMapShader) delete mShadowMapShader;
delete mCustomPostProcessShaders;
}
Expand Down
4 changes: 0 additions & 4 deletions src/gl/renderer/gl_renderer.h
Expand Up @@ -29,7 +29,6 @@ class FLinearDepthShader;
class FDepthBlurShader;
class FSSAOShader;
class FSSAOCombineShader;
class FTonemapShader;
class FPresentShader;
class FPresent3DCheckerShader;
class FPresent3DColumnShader;
Expand Down Expand Up @@ -74,8 +73,6 @@ class FGLRenderer
FSSAOShader *mSSAOShader;
FDepthBlurShader *mDepthBlurShader;
FSSAOCombineShader *mSSAOCombineShader;
FTonemapShader *mTonemapShader;
FHardwareTexture *mTonemapPalette;
FPresentShader *mPresentShader;
FPresent3DCheckerShader *mPresent3dCheckerShader;
FPresent3DColumnShader *mPresent3dColumnShader;
Expand Down Expand Up @@ -118,7 +115,6 @@ class FGLRenderer
void BloomScene(int fixedcm);
void TonemapScene();
void ColormapScene(int fixedcm);
void CreateTonemapPalette();
void ClearTonemapPalette();
void LensDistortScene();
void ApplyFXAA();
Expand Down
76 changes: 76 additions & 0 deletions src/hwrenderer/postprocessing/hw_postprocess.cpp
Expand Up @@ -514,3 +514,79 @@ void PPColormap::UpdateSteps(int fixedcm)
steps.Push(step);
hw_postprocess.Effects["ColormapScene"] = steps;
}

/////////////////////////////////////////////////////////////////////////////

void PPTonemap::DeclareShaders()
{
hw_postprocess.Shaders["Tonemap.Linear"] = { "shaders/glsl/tonemap.fp", "#define LINEAR\n", {} };
hw_postprocess.Shaders["Tonemap.Reinhard"] = { "shaders/glsl/tonemap.fp", "#define REINHARD\n", {} };
hw_postprocess.Shaders["Tonemap.HejlDawson"] = { "shaders/glsl/tonemap.fp", "#define HEJLDAWSON\n", {} };
hw_postprocess.Shaders["Tonemap.Uncharted2"] = { "shaders/glsl/tonemap.fp", "#define UNCHARTED2\n", {} };
hw_postprocess.Shaders["Tonemap.Palette"] = { "shaders/glsl/tonemap.fp", "#define PALETTE\n", {} };
}

void PPTonemap::UpdateTextures()
{
if (gl_tonemap == Palette)
{
auto &texture = hw_postprocess.Textures["Tonemap.Palette"];
if (!texture.Data)
{
std::shared_ptr<void> data(new uint32_t[512 * 512], [](void *p) { delete[](uint32_t*)p; });

uint8_t *lut = (uint8_t *)data.get();
for (int r = 0; r < 64; r++)
{
for (int g = 0; g < 64; g++)
{
for (int b = 0; b < 64; b++)
{
PalEntry color = GPalette.BaseColors[(uint8_t)PTM_BestColor((uint32_t *)GPalette.BaseColors, (r << 2) | (r >> 4), (g << 2) | (g >> 4), (b << 2) | (b >> 4),
gl_paltonemap_reverselookup, gl_paltonemap_powtable, 0, 256)];
int index = ((r * 64 + g) * 64 + b) * 4;
lut[index] = color.r;
lut[index + 1] = color.g;
lut[index + 2] = color.b;
lut[index + 3] = 255;
}
}
}

texture = { 512, 512, PixelFormat::Rgba8, data };
}
}
}

void PPTonemap::UpdateSteps()
{
if (gl_tonemap == 0)
{
hw_postprocess.Effects["TonemapScene"] = {};
return;
}

PPShaderName shader;
switch (gl_tonemap)
{
default:
case Linear: shader = "Tonemap.Linear"; break;
case Reinhard: shader = "Tonemap.Reinhard"; break;
case HejlDawson: shader = "Tonemap.HejlDawson"; break;
case Uncharted2: shader = "Tonemap.Uncharted2"; break;
case Palette: shader = "Tonemap.Palette"; break;
}

PPStep step;
step.ShaderName = shader;
step.Viewport = screen->mScreenViewport;
step.SetInputCurrent(0);
if (gl_tonemap == Palette)
step.SetInputTexture(1, "Tonemap.Palette");
step.SetOutputNext();
step.SetNoBlend();

TArray<PPStep> steps;
steps.Push(step);
hw_postprocess.Effects["TonemapScene"] = steps;
}
24 changes: 23 additions & 1 deletion src/hwrenderer/postprocessing/hw_postprocess.h
Expand Up @@ -179,11 +179,12 @@ class PPTextureDesc
{
public:
PPTextureDesc() { }
PPTextureDesc(int width, int height, PixelFormat format) : Width(width), Height(height), Format(format) { }
PPTextureDesc(int width, int height, PixelFormat format, std::shared_ptr<void> data = {}) : Width(width), Height(height), Format(format), Data(data) { }

int Width;
int Height;
PixelFormat Format;
std::shared_ptr<void> Data;
};

class PPShader
Expand Down Expand Up @@ -411,3 +412,24 @@ class PPColormap
void DeclareShaders();
void UpdateSteps(int fixedcm);
};

/////////////////////////////////////////////////////////////////////////////

class PPTonemap
{
public:
void DeclareShaders();
void UpdateTextures();
void UpdateSteps();

enum TonemapMode
{
None,
Uncharted2,
HejlDawson,
Reinhard,
Linear,
Palette,
NumTonemapModes
};
};
63 changes: 0 additions & 63 deletions src/hwrenderer/postprocessing/hw_tonemapshader.cpp

This file was deleted.

30 changes: 0 additions & 30 deletions src/hwrenderer/postprocessing/hw_tonemapshader.h

This file was deleted.

0 comments on commit b2fad45

Please sign in to comment.