1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-07 03:13:49 +00:00

Add config options for Bloom.

This commit is contained in:
Sergey Lipskiy 2015-01-31 13:50:06 +06:00
parent 5af3ed1197
commit 42739a2e72
6 changed files with 106 additions and 71 deletions

View File

@ -55,6 +55,14 @@ struct Config
u32 N64DepthCompare;
} frameBufferEmulation;
struct {
u32 mode;
u32 thresholdLevel;
u32 blendMode;
u32 blurAmount;
u32 blurStrength;
} bloomFilter;
struct
{
std::string name;

View File

@ -1276,7 +1276,8 @@ void OGLRender::_initData()
Combiner_Init();
TextDrawer::get().init();
TFH.init();
PostProcessor::get().init();
if (config.bloomFilter.mode != 0)
PostProcessor::get().init();
m_renderState = rsNone;
gSP.changed = gDP.changed = 0xFFFFFFFF;
@ -1295,7 +1296,8 @@ void OGLRender::_initData()
void OGLRender::_destroyData()
{
m_renderState = rsNone;
PostProcessor::get().destroy();
if (config.bloomFilter.mode != 0)
PostProcessor::get().destroy();
TextDrawer::get().destroy();
Combiner_Destroy();
FrameBuffer_Destroy();

View File

@ -4,6 +4,7 @@
#include "gSP.h"
#include "PostProcessor.h"
#include "FrameBuffer.h"
#include "Config.h"
static const char * vertexShader =
"#version 330 core \n"
@ -290,47 +291,50 @@ GLuint _createFBO(CachedTexture * _pTexture)
void PostProcessor::init()
{
m_extractBloomProgram = _createShaderProgram(vertexShader, extractBloomShader);
glUseProgram(m_extractBloomProgram);
int loc = glGetUniformLocation(m_extractBloomProgram, "ThresholdLevel");
assert(loc >= 0);
glUniform1i(loc, 4);
m_seperableBlurProgram = _createShaderProgram(vertexShader, seperableBlurShader);
glUseProgram(m_seperableBlurProgram);
loc = glGetUniformLocation(m_seperableBlurProgram, "TexelSize");
assert(loc >= 0);
glUniform2f(loc, 1.0f/video().getWidth(), 1.0f/video().getHeight());
loc = glGetUniformLocation(m_seperableBlurProgram, "Orientation");
assert(loc >= 0);
glUniform1i(loc, 0);
loc = glGetUniformLocation(m_seperableBlurProgram, "BlurAmount");
assert(loc >= 0);
glUniform1i(loc, 10);
loc = glGetUniformLocation(m_seperableBlurProgram, "BlurScale");
assert(loc >= 0);
glUniform1f(loc, 1.0f);
loc = glGetUniformLocation(m_seperableBlurProgram, "BlurStrength");
assert(loc >= 0);
glUniform1f(loc, 0.5f);
m_glowProgram = _createShaderProgram(vertexShader, glowShader);
glUseProgram(m_glowProgram);
loc = glGetUniformLocation(m_glowProgram, "BlendMode");
assert(loc >= 0);
glUniform1i(loc, 1);
m_bloomProgram = _createShaderProgram(vertexShader, simpleBloomShader);
glUseProgram(0);
m_pTextureOriginal = _createTexture();
m_pTextureGlowMap = _createTexture();
m_pTextureBlur = _createTexture();
m_FBO_original = _createFBO(m_pTextureOriginal);
m_FBO_glowMap = _createFBO(m_pTextureGlowMap);
m_FBO_blur = _createFBO(m_pTextureBlur);
if (config.bloomFilter.mode == 1) {
m_bloomProgram = _createShaderProgram(vertexShader, simpleBloomShader);
} else {
m_extractBloomProgram = _createShaderProgram(vertexShader, extractBloomShader);
glUseProgram(m_extractBloomProgram);
int loc = glGetUniformLocation(m_extractBloomProgram, "ThresholdLevel");
assert(loc >= 0);
glUniform1i(loc, config.bloomFilter.thresholdLevel);
m_seperableBlurProgram = _createShaderProgram(vertexShader, seperableBlurShader);
glUseProgram(m_seperableBlurProgram);
loc = glGetUniformLocation(m_seperableBlurProgram, "TexelSize");
assert(loc >= 0);
glUniform2f(loc, 1.0f / video().getWidth(), 1.0f / video().getHeight());
loc = glGetUniformLocation(m_seperableBlurProgram, "Orientation");
assert(loc >= 0);
glUniform1i(loc, 0);
loc = glGetUniformLocation(m_seperableBlurProgram, "BlurAmount");
assert(loc >= 0);
glUniform1i(loc, config.bloomFilter.blurAmount);
loc = glGetUniformLocation(m_seperableBlurProgram, "BlurScale");
assert(loc >= 0);
glUniform1f(loc, 1.0f);
loc = glGetUniformLocation(m_seperableBlurProgram, "BlurStrength");
assert(loc >= 0);
glUniform1f(loc, config.bloomFilter.blurStrength/100.0f);
m_glowProgram = _createShaderProgram(vertexShader, glowShader);
glUseProgram(m_glowProgram);
loc = glGetUniformLocation(m_glowProgram, "BlendMode");
assert(loc >= 0);
glUniform1i(loc, config.bloomFilter.blendMode);
glUseProgram(0);
m_pTextureGlowMap = _createTexture();
m_pTextureBlur = _createTexture();
m_FBO_glowMap = _createFBO(m_pTextureGlowMap);
m_FBO_blur = _createFBO(m_pTextureBlur);
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
}
@ -402,6 +406,9 @@ void _setGLState() {
void PostProcessor::process(FrameBuffer * _pBuffer)
{
if (config.bloomFilter.mode == 0)
return;
_setGLState();
OGLVideo & ogl = video();
@ -413,40 +420,39 @@ void PostProcessor::process(FrameBuffer * _pBuffer)
GL_COLOR_BUFFER_BIT, GL_LINEAR
);
#if 0
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
textureCache().activateTexture(0, m_pTextureOriginal);
glUseProgram(m_bloomProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
#else
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
if (config.bloomFilter.mode == 1) {
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
textureCache().activateTexture(0, m_pTextureOriginal);
glUseProgram(m_bloomProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
} else {
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_glowMap);
textureCache().activateTexture(0, m_pTextureOriginal);
glUseProgram(m_extractBloomProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_glowMap);
textureCache().activateTexture(0, m_pTextureOriginal);
glUseProgram(m_extractBloomProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_blur);
textureCache().activateTexture(0, m_pTextureGlowMap);
glUseProgram(m_seperableBlurProgram);
int loc = glGetUniformLocation(m_seperableBlurProgram, "Orientation");
assert(loc >= 0);
glUniform1i(loc, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_blur);
textureCache().activateTexture(0, m_pTextureGlowMap);
glUseProgram(m_seperableBlurProgram);
int loc = glGetUniformLocation(m_seperableBlurProgram, "Orientation");
assert(loc >= 0);
glUniform1i(loc, 0);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_glowMap);
textureCache().activateTexture(0, m_pTextureBlur);
glUniform1i(loc, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
textureCache().activateTexture(0, m_pTextureOriginal);
textureCache().activateTexture(1, m_pTextureGlowMap);
glUseProgram(m_glowProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
#endif
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_FBO_glowMap);
textureCache().activateTexture(0, m_pTextureBlur);
glUniform1i(loc, 1);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, _pBuffer->m_FBO);
textureCache().activateTexture(0, m_pTextureOriginal);
textureCache().activateTexture(1, m_pTextureGlowMap);
glUseProgram(m_glowProgram);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
video().getRender().dropRenderState();
glUseProgram(0);

View File

@ -113,6 +113,17 @@ bool Config_SetDefault()
res = ConfigSetDefaultString(g_configVideoGliden64, "fontColor", "B5E61D", "Font color in RGB format.");
assert(res == M64ERR_SUCCESS);
//#Bloom filter settings
res = ConfigSetDefaultInt(g_configVideoGliden64, "bloomMode", 0, "Bloom filter mode (0=none, 1=Single pass, 2=Multi pass)");
assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultInt(g_configVideoGliden64, "bloomThresholdLevel", 4, "Brightness threshold level for bloom. Values [2, 6]");
assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultInt(g_configVideoGliden64, "bloomBlendMode", 0, "Bloom blend mode (0=Strong, 1=Mild, 2=Light)");
assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultInt(g_configVideoGliden64, "blurAmount", 10, "Blur radius. Values [2, 10]");
assert(res == M64ERR_SUCCESS);
res = ConfigSetDefaultInt(g_configVideoGliden64, "blurStrength", 20, "Blur strength. Values [10, 100]");
assert(res == M64ERR_SUCCESS);
return res == M64ERR_SUCCESS;
}
@ -176,6 +187,12 @@ void Config_LoadConfig()
config.font.size = ConfigGetParamInt(g_configVideoGliden64, "fontSize");
if (config.font.size == 0)
config.font.size = 30;
//#Bloom filter settings
config.bloomFilter.mode = ConfigGetParamInt(g_configVideoGliden64, "bloomMode");
config.bloomFilter.thresholdLevel = ConfigGetParamInt(g_configVideoGliden64, "bloomThresholdLevel");
config.bloomFilter.blendMode = ConfigGetParamInt(g_configVideoGliden64, "bloomBlendMode");
config.bloomFilter.blurAmount = ConfigGetParamInt(g_configVideoGliden64, "blurAmount");
config.bloomFilter.blurStrength = ConfigGetParamInt(g_configVideoGliden64, "blurStrength");
}
#if 0

View File

@ -476,6 +476,7 @@ void Config_LoadConfig()
config.frameBufferEmulation.N64DepthCompare = FALSE;
config.enableLOD = TRUE;
config.hacks = 0;
config.bloomFilter.mode = 0;
}
void Config_DoConfig(HWND /*hParent*/)

View File

@ -122,6 +122,7 @@ void Config_LoadConfig()
config.enableLOD = TRUE;
config.enableNoise = TRUE;
config.hacks = 0;
config.bloomFilter.mode = 0;
}
void Config_SaveConfig()