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:
parent
5af3ed1197
commit
42739a2e72
8
Config.h
8
Config.h
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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*/)
|
||||
|
|
|
@ -122,6 +122,7 @@ void Config_LoadConfig()
|
|||
config.enableLOD = TRUE;
|
||||
config.enableNoise = TRUE;
|
||||
config.hacks = 0;
|
||||
config.bloomFilter.mode = 0;
|
||||
}
|
||||
|
||||
void Config_SaveConfig()
|
||||
|
|
Loading…
Reference in New Issue
Block a user