mirror of
https://github.com/blawar/GLideN64.git
synced 2024-07-02 09:03:37 +00:00
Remove ditheringMode and bufferDitheringMode settings.
Add new settings: - enableHiresNoiseDithering - enableDitheringPattern - enableDitheringQuantization - rdramImageDitheringMode New settings are not implemented in GUI yet.
This commit is contained in:
parent
2600a6bc90
commit
897fc35d51
|
@ -261,26 +261,29 @@ u16 ColorBufferToRDRAM::_RGBAtoRGBA16(u32 _c, u32 x, u32 y) {
|
|||
union RGBA c;
|
||||
c.raw = _c;
|
||||
|
||||
switch (config.generalEmulation.bufferDitheringMode) {
|
||||
case Config::BufferDitheringMode::bdmBayer:
|
||||
case Config::BufferDitheringMode::bdmMagicSquare:
|
||||
{
|
||||
s32 threshold = config.generalEmulation.bufferDitheringMode == Config::BufferDitheringMode::bdmBayer ?
|
||||
thresholdMapBayer[x & 3][y & 3] :
|
||||
thresholdMapMagicSquare[x & 3][y & 3];
|
||||
c.r = (u8)std::max(std::min((s32)c.r + threshold, 255), 0);
|
||||
c.g = (u8)std::max(std::min((s32)c.g + threshold, 255), 0);
|
||||
c.b = (u8)std::max(std::min((s32)c.b + threshold, 255), 0);
|
||||
}
|
||||
break;
|
||||
case Config::BufferDitheringMode::bdmBlueNoise:
|
||||
{
|
||||
const BlueNoiseItem& threshold = blueNoiseTex[m_blueNoiseIdx & 7][x & 63][y & 63];
|
||||
c.r = (u8)std::max(std::min((s32)c.r + threshold.r, 255), 0);
|
||||
c.g = (u8)std::max(std::min((s32)c.g + threshold.g, 255), 0);
|
||||
c.b = (u8)std::max(std::min((s32)c.b + threshold.b, 255), 0);
|
||||
}
|
||||
break;
|
||||
if (config.generalEmulation.enableDitheringPattern == 0 || config.frameBufferEmulation.nativeResFactor != 1) {
|
||||
// Apply color dithering
|
||||
switch (config.generalEmulation.rdramImageDitheringMode) {
|
||||
case Config::BufferDitheringMode::bdmBayer:
|
||||
case Config::BufferDitheringMode::bdmMagicSquare:
|
||||
{
|
||||
s32 threshold = config.generalEmulation.rdramImageDitheringMode == Config::BufferDitheringMode::bdmBayer ?
|
||||
thresholdMapBayer[x & 3][y & 3] :
|
||||
thresholdMapMagicSquare[x & 3][y & 3];
|
||||
c.r = (u8)std::max(std::min((s32)c.r + threshold, 255), 0);
|
||||
c.g = (u8)std::max(std::min((s32)c.g + threshold, 255), 0);
|
||||
c.b = (u8)std::max(std::min((s32)c.b + threshold, 255), 0);
|
||||
}
|
||||
break;
|
||||
case Config::BufferDitheringMode::bdmBlueNoise:
|
||||
{
|
||||
const BlueNoiseItem& threshold = blueNoiseTex[m_blueNoiseIdx & 7][x & 63][y & 63];
|
||||
c.r = (u8)std::max(std::min((s32)c.r + threshold.r, 255), 0);
|
||||
c.g = (u8)std::max(std::min((s32)c.g + threshold.g, 255), 0);
|
||||
c.b = (u8)std::max(std::min((s32)c.b + threshold.b, 255), 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return ((c.r >> 3) << 11) | ((c.g >> 3) << 6) | ((c.b >> 3) << 1) | (c.a == 0 ? 0 : 1);
|
||||
|
|
|
@ -38,8 +38,10 @@ void Config::resetToDefaults()
|
|||
texture.screenShotFormat = 0;
|
||||
|
||||
generalEmulation.enableLOD = 1;
|
||||
generalEmulation.ditheringMode = DitheringMode::dmNoise;
|
||||
generalEmulation.bufferDitheringMode = BufferDitheringMode::bdmBlueNoise;
|
||||
generalEmulation.enableHiresNoiseDithering = 0;
|
||||
generalEmulation.enableDitheringPattern = 0;
|
||||
generalEmulation.enableDitheringQuantization = 0;
|
||||
generalEmulation.rdramImageDitheringMode = BufferDitheringMode::bdmBlueNoise;
|
||||
generalEmulation.enableHWLighting = 0;
|
||||
generalEmulation.enableCustomSettings = 1;
|
||||
generalEmulation.enableShadersStorage = 1;
|
||||
|
|
14
src/Config.h
14
src/Config.h
|
@ -46,14 +46,6 @@ struct Config
|
|||
tcForce
|
||||
};
|
||||
|
||||
enum DitheringMode {
|
||||
dmDisable = 0,
|
||||
dmNoise,
|
||||
dmNoiseWithQuant,
|
||||
dmFull,
|
||||
dmFullWithQuant
|
||||
};
|
||||
|
||||
enum BufferDitheringMode {
|
||||
bdmDisable = 0,
|
||||
bdmBayer,
|
||||
|
@ -62,8 +54,10 @@ struct Config
|
|||
};
|
||||
|
||||
struct {
|
||||
u32 ditheringMode;
|
||||
u32 bufferDitheringMode;
|
||||
u32 enableHiresNoiseDithering;
|
||||
u32 enableDitheringPattern;
|
||||
u32 enableDitheringQuantization;
|
||||
u32 rdramImageDitheringMode;
|
||||
u32 enableLOD;
|
||||
u32 enableHWLighting;
|
||||
u32 enableCustomSettings;
|
||||
|
|
|
@ -142,7 +142,7 @@ void ConfigDialog::_init(bool reInit, bool blockCustomSettings)
|
|||
break;
|
||||
}
|
||||
|
||||
ui->ditheringModeComboBox->setCurrentIndex(config.generalEmulation.ditheringMode);
|
||||
ui->ditheringModeComboBox->setCurrentIndex(config.generalEmulation.rdramImageDitheringMode);
|
||||
|
||||
switch (config.texture.screenShotFormat) {
|
||||
case 0:
|
||||
|
@ -444,7 +444,7 @@ void ConfigDialog::accept(bool justSave) {
|
|||
else if (ui->blnr3PointRadioButton->isChecked())
|
||||
config.texture.bilinearMode = BILINEAR_3POINT;
|
||||
|
||||
config.generalEmulation.ditheringMode = ui->ditheringModeComboBox->currentIndex();
|
||||
config.generalEmulation.rdramImageDitheringMode = ui->ditheringModeComboBox->currentIndex();
|
||||
|
||||
if (ui->pngRadioButton->isChecked())
|
||||
config.texture.screenShotFormat = 0;
|
||||
|
|
|
@ -40,7 +40,7 @@ void _loadSettings(QSettings & settings)
|
|||
settings.endGroup();
|
||||
|
||||
settings.beginGroup("generalEmulation");
|
||||
config.generalEmulation.ditheringMode = settings.value("ditheringMode", config.generalEmulation.ditheringMode).toInt();
|
||||
config.generalEmulation.enableDitheringPattern = settings.value("enableDitheringPattern", config.generalEmulation.enableDitheringPattern).toInt();
|
||||
config.generalEmulation.enableLOD = settings.value("enableLOD", config.generalEmulation.enableLOD).toInt();
|
||||
config.generalEmulation.enableHWLighting = settings.value("enableHWLighting", config.generalEmulation.enableHWLighting).toInt();
|
||||
config.generalEmulation.enableShadersStorage = settings.value("enableShadersStorage", config.generalEmulation.enableShadersStorage).toInt();
|
||||
|
@ -212,7 +212,7 @@ void writeSettings(const QString & _strIniFolder)
|
|||
settings.endGroup();
|
||||
|
||||
settings.beginGroup("generalEmulation");
|
||||
settings.setValue("ditheringMode", config.generalEmulation.ditheringMode);
|
||||
settings.setValue("enableDitheringPattern", config.generalEmulation.enableDitheringPattern);
|
||||
settings.setValue("enableLOD", config.generalEmulation.enableLOD);
|
||||
settings.setValue("enableHWLighting", config.generalEmulation.enableHWLighting);
|
||||
settings.setValue("enableShadersStorage", config.generalEmulation.enableShadersStorage);
|
||||
|
@ -402,7 +402,7 @@ void saveCustomRomSettings(const QString & _strIniFolder, const char * _strRomNa
|
|||
settings.endGroup();
|
||||
|
||||
settings.beginGroup("generalEmulation");
|
||||
WriteCustomSetting(generalEmulation, ditheringMode);
|
||||
WriteCustomSetting(generalEmulation, enableDitheringPattern);
|
||||
WriteCustomSetting(generalEmulation, enableLOD);
|
||||
WriteCustomSetting(generalEmulation, enableHWLighting);
|
||||
WriteCustomSetting(generalEmulation, enableShadersStorage);
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>559</width>
|
||||
<height>595</height>
|
||||
<height>613</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
|
@ -899,10 +899,24 @@
|
|||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="shaderDitheringCheckBox">
|
||||
<property name="text">
|
||||
<string>Dithering pattern on output image</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="hiresNoiseDitheringCheckBox">
|
||||
<property name="text">
|
||||
<string>High resolution noise dithering</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="ditheringLabel">
|
||||
<property name="text">
|
||||
<string>Dithering mode:</string>
|
||||
<string>RDRAM image dithering mode:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
@ -915,22 +929,17 @@
|
|||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>only noise dithering (default)</string>
|
||||
<string>Bayer</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>noise dithering with 5bit quantization</string>
|
||||
<string>Magic square</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>noise and ordered grid dithering</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>dithering with 5bit quantization</string>
|
||||
<string>Blue noise</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
|
@ -4049,9 +4058,9 @@
|
|||
</connection>
|
||||
</connections>
|
||||
<buttongroups>
|
||||
<buttongroup name="screenshotButtonGroup"/>
|
||||
<buttongroup name="factorButtonGroup"/>
|
||||
<buttongroup name="fixTexrectCoordsButtonGroup"/>
|
||||
<buttongroup name="osdButtonGroup"/>
|
||||
<buttongroup name="fixTexrectCoordsButtonGroup"/>
|
||||
<buttongroup name="screenshotButtonGroup"/>
|
||||
</buttongroups>
|
||||
</ui>
|
||||
|
|
|
@ -12,10 +12,9 @@ namespace graphics {
|
|||
vecOptions.push_back(config.texture.bilinearMode);
|
||||
vecOptions.push_back(config.texture.enableHalosRemoval);
|
||||
vecOptions.push_back(config.generalEmulation.enableHWLighting);
|
||||
vecOptions.push_back(config.generalEmulation.ditheringMode == Config::DitheringMode::dmNoise ? 1 : 0);
|
||||
vecOptions.push_back(config.generalEmulation.ditheringMode == Config::DitheringMode::dmNoiseWithQuant ? 1 : 0);
|
||||
vecOptions.push_back(config.generalEmulation.ditheringMode == Config::DitheringMode::dmFull ? 1 : 0);
|
||||
vecOptions.push_back(config.generalEmulation.ditheringMode == Config::DitheringMode::dmFullWithQuant ? 1 : 0);
|
||||
vecOptions.push_back(config.generalEmulation.enableHiresNoiseDithering);
|
||||
vecOptions.push_back(config.generalEmulation.enableDitheringPattern);
|
||||
vecOptions.push_back(config.generalEmulation.enableDitheringQuantization);
|
||||
vecOptions.push_back(config.generalEmulation.enableLOD);
|
||||
vecOptions.push_back(config.frameBufferEmulation.N64DepthCompare == Config::dcFast ? 1 : 0);
|
||||
vecOptions.push_back(config.frameBufferEmulation.N64DepthCompare == Config::dcCompatible ? 1 : 0);
|
||||
|
|
|
@ -718,61 +718,62 @@ class ShaderCallDither : public ShaderPart
|
|||
public:
|
||||
ShaderCallDither(const opengl::GLInfo & _glinfo)
|
||||
{
|
||||
if (!_glinfo.isGLES2) {
|
||||
if (config.generalEmulation.ditheringMode != Config::DitheringMode::dmDisable) {
|
||||
m_part =
|
||||
" if (uColorDitherMode == 2) { \n"
|
||||
" colorNoiseDither(snoiseRGB(), clampedColor.rgb); \n"
|
||||
" quantizeRGB(clampedColor.rgb); \n"
|
||||
" } \n"
|
||||
" if (uAlphaDitherMode == 2) { \n"
|
||||
" alphaNoiseDither(snoiseA(), clampedColor.a); \n"
|
||||
" quantizeA(clampedColor.a); \n"
|
||||
" } \n"
|
||||
if (_glinfo.isGLES2)
|
||||
return;
|
||||
|
||||
m_part =
|
||||
" if (uColorDitherMode == 2) { \n"
|
||||
" colorNoiseDither(snoiseRGB(), clampedColor.rgb); \n"
|
||||
" quantizeRGB(clampedColor.rgb); \n"
|
||||
" } \n"
|
||||
" if (uAlphaDitherMode == 2) { \n"
|
||||
" alphaNoiseDither(snoiseA(), clampedColor.a); \n"
|
||||
" quantizeA(clampedColor.a); \n"
|
||||
" } \n"
|
||||
;
|
||||
|
||||
if (config.generalEmulation.enableDitheringPattern != 0) {
|
||||
m_part +=
|
||||
// Try to keep dithering visible even at higher resolutions
|
||||
" lowp float divider = 1.0 + step(3.0, uScreenScale.x); \n"
|
||||
" mediump ivec2 position = ivec2(mod((gl_FragCoord.xy - 0.5) / divider,4.0));\n"
|
||||
" \n"
|
||||
" lowp mat4 bayer = mat4( 0.0, 0.75, 0.1875, 0.9375, \n"
|
||||
" 0.5, 0.25, 0.6875, 0.4375, \n"
|
||||
" 0.125, 0.875, 0.0625, 0.8125, \n"
|
||||
" 0.625, 0.375, 0.5625, 0.3125); \n"
|
||||
" lowp mat4 mSquare = mat4( 0.0, 0.6875, 0.75, 0.4375, \n"
|
||||
" 0.875, 0.3125, 0.125, 0.5625, \n"
|
||||
" 0.1875, 0.5, 0.9375, 0.25, \n"
|
||||
" 0.8125, 0.375, 0.0625, 0.625); \n"
|
||||
" \n"
|
||||
" lowp float bayerThreshold = bayer[position.x][position.y]; \n"
|
||||
" lowp float mSquareThreshold = mSquare[position.x][position.y]; \n"
|
||||
" \n"
|
||||
" if (uColorDitherMode < 2) { \n"
|
||||
" lowp float threshold = mix(mSquareThreshold,bayerThreshold,float(uColorDitherMode));\n"
|
||||
" colorNoiseDither(vec3(threshold), clampedColor.rgb); \n"
|
||||
// 16 Bit quantization
|
||||
" quantizeRGB(clampedColor.rgb); \n"
|
||||
" } \n"
|
||||
" if (uAlphaDitherMode < 2) { \n"
|
||||
" lowp float thresholdPattern = mix(mSquareThreshold,bayerThreshold,clamp(float(uColorDitherMode),0.0,1.0));\n"
|
||||
" thresholdPattern = mix(thresholdPattern,mSquareThreshold,clamp(float(uColorDitherMode - 1),0.0,1.0));\n" // uColorDitherMode = 2
|
||||
" thresholdPattern = mix(thresholdPattern,bayerThreshold,clamp(float(uColorDitherMode - 2),0.0,1.0));\n" // uColorDitherMode = 3
|
||||
" \n"
|
||||
" lowp float thresholdNotPattern = mix(bayerThreshold,mSquareThreshold,clamp(float(uColorDitherMode),0.0,1.0));\n"
|
||||
" thresholdNotPattern = mix(thresholdNotPattern,bayerThreshold,clamp(float(uColorDitherMode - 1),0.0,1.0));\n" // uColorDitherMode = 2
|
||||
" thresholdNotPattern = mix(thresholdNotPattern,mSquareThreshold,clamp(float(uColorDitherMode - 2),0.0,1.0));\n" // uColorDitherMode = 3
|
||||
" \n"
|
||||
" lowp float threshold = mix(thresholdNotPattern, thresholdPattern,float(uAlphaDitherMode));\n"
|
||||
" alphaNoiseDither(threshold, clampedColor.a); \n"
|
||||
// 16 Bit quantization
|
||||
" quantizeA(clampedColor.a); \n"
|
||||
" } \n"
|
||||
;
|
||||
}
|
||||
if (config.generalEmulation.ditheringMode >= Config::DitheringMode::dmFull) {
|
||||
m_part +=
|
||||
// Try to keep dithering visible even at higher resolutions
|
||||
" lowp float divider = 1.0 + step(3.0, uScreenScale.x); \n"
|
||||
" mediump ivec2 position = ivec2(mod((gl_FragCoord.xy - 0.5) / divider,4.0));\n"
|
||||
" \n"
|
||||
" lowp mat4 bayer = mat4( 0.0, 0.75, 0.1875, 0.9375, \n"
|
||||
" 0.5, 0.25, 0.6875, 0.4375, \n"
|
||||
" 0.125, 0.875, 0.0625, 0.8125, \n"
|
||||
" 0.625, 0.375, 0.5625, 0.3125); \n"
|
||||
" lowp mat4 mSquare = mat4( 0.0, 0.6875, 0.75, 0.4375, \n"
|
||||
" 0.875, 0.3125, 0.125, 0.5625, \n"
|
||||
" 0.1875, 0.5, 0.9375, 0.25, \n"
|
||||
" 0.8125, 0.375, 0.0625, 0.625); \n"
|
||||
" \n"
|
||||
" lowp float bayerThreshold = bayer[position.x][position.y]; \n"
|
||||
" lowp float mSquareThreshold = mSquare[position.x][position.y]; \n"
|
||||
" \n"
|
||||
" if (uColorDitherMode < 2) { \n"
|
||||
" lowp float threshold = mix(mSquareThreshold,bayerThreshold,float(uColorDitherMode));\n"
|
||||
" colorNoiseDither(vec3(threshold), clampedColor.rgb); \n"
|
||||
// 16 Bit quantization
|
||||
" quantizeRGB(clampedColor.rgb); \n"
|
||||
" } \n"
|
||||
" if (uAlphaDitherMode < 2) { \n"
|
||||
" lowp float thresholdPattern = mix(mSquareThreshold,bayerThreshold,clamp(float(uColorDitherMode),0.0,1.0));\n"
|
||||
" thresholdPattern = mix(thresholdPattern,mSquareThreshold,clamp(float(uColorDitherMode - 1),0.0,1.0));\n" // uColorDitherMode = 2
|
||||
" thresholdPattern = mix(thresholdPattern,bayerThreshold,clamp(float(uColorDitherMode - 2),0.0,1.0));\n" // uColorDitherMode = 3
|
||||
" \n"
|
||||
" lowp float thresholdNotPattern = mix(bayerThreshold,mSquareThreshold,clamp(float(uColorDitherMode),0.0,1.0));\n"
|
||||
" thresholdNotPattern = mix(thresholdNotPattern,bayerThreshold,clamp(float(uColorDitherMode - 1),0.0,1.0));\n" // uColorDitherMode = 2
|
||||
" thresholdNotPattern = mix(thresholdNotPattern,mSquareThreshold,clamp(float(uColorDitherMode - 2),0.0,1.0));\n" // uColorDitherMode = 3
|
||||
" \n"
|
||||
" lowp float threshold = mix(thresholdNotPattern, thresholdPattern,float(uAlphaDitherMode));\n"
|
||||
" alphaNoiseDither(threshold, clampedColor.a); \n"
|
||||
// 16 Bit quantization
|
||||
" quantizeA(clampedColor.a); \n"
|
||||
" } \n"
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class ShaderFragmentGlobalVariablesTex : public ShaderPart
|
||||
|
@ -1041,18 +1042,17 @@ class ShaderFragmentHeaderDither : public ShaderPart
|
|||
public:
|
||||
ShaderFragmentHeaderDither(const opengl::GLInfo & _glinfo)
|
||||
{
|
||||
if (!_glinfo.isGLES2) {
|
||||
if (config.generalEmulation.ditheringMode != Config::DitheringMode::dmDisable) {
|
||||
m_part =
|
||||
"void colorNoiseDither(in lowp vec3 _noise, inout lowp vec3 _color);\n"
|
||||
"void alphaNoiseDither(in lowp float _noise, inout lowp float _alpha);\n"
|
||||
"void quantizeRGB(inout lowp vec3 _color);\n"
|
||||
"void quantizeA(inout lowp float _alpha);\n"
|
||||
"lowp vec3 snoiseRGB();\n"
|
||||
"lowp float snoiseA();\n"
|
||||
;
|
||||
}
|
||||
}
|
||||
if (_glinfo.isGLES2)
|
||||
return;
|
||||
|
||||
m_part =
|
||||
"void colorNoiseDither(in lowp vec3 _noise, inout lowp vec3 _color);\n"
|
||||
"void alphaNoiseDither(in lowp float _noise, inout lowp float _alpha);\n"
|
||||
"void quantizeRGB(inout lowp vec3 _color);\n"
|
||||
"void quantizeA(inout lowp float _alpha);\n"
|
||||
"lowp vec3 snoiseRGB();\n"
|
||||
"lowp float snoiseA();\n"
|
||||
;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -1651,68 +1651,66 @@ class ShaderDither : public ShaderPart
|
|||
public:
|
||||
ShaderDither(const opengl::GLInfo & _glinfo)
|
||||
{
|
||||
if (!_glinfo.isGLES2) {
|
||||
if (config.generalEmulation.ditheringMode != Config::DitheringMode::dmDisable) {
|
||||
m_part =
|
||||
"void colorNoiseDither(in lowp vec3 _noise, inout lowp vec3 _color)\n"
|
||||
"{ \n"
|
||||
" mediump vec3 threshold = 7.0 / 255.0 * (_noise - 0.5);\n"
|
||||
" _color = clamp(_color + threshold,0.0,1.0); \n"
|
||||
"} \n"
|
||||
"void alphaNoiseDither(in lowp float _noise, inout lowp float _alpha)\n"
|
||||
"{ \n"
|
||||
" mediump float threshold = 7.0 / 255.0 * (_noise - 0.5);\n"
|
||||
" _alpha = clamp(_alpha + threshold,0.0,1.0); \n"
|
||||
"} \n"
|
||||
"lowp vec3 snoiseRGB() \n"
|
||||
"{ \n"
|
||||
" mediump vec2 texSize = vec2(640.0, 580.0); \n"
|
||||
// multiplier for higher res noise effect
|
||||
" lowp float mult = 1.0 + step(2.0, uScreenScale.x); \n"
|
||||
" \n"
|
||||
" mediump vec2 coordR = mult * ((gl_FragCoord.xy)/uScreenScale/texSize);\n"
|
||||
" mediump vec2 coordG = mult * ((gl_FragCoord.xy + vec2( 0.0, texSize.y / 2.0 ))/uScreenScale/texSize);\n"
|
||||
" mediump vec2 coordB = mult * ((gl_FragCoord.xy + vec2( texSize.x / 2.0, 0.0))/uScreenScale/texSize);\n"
|
||||
" \n"
|
||||
// Only red channel of noise texture contains noise.
|
||||
" lowp float r = texture(uTexNoise,coordR).r; \n"
|
||||
" lowp float g = texture(uTexNoise,coordG).r; \n"
|
||||
" lowp float b = texture(uTexNoise,coordB).r; \n"
|
||||
" \n"
|
||||
" return vec3(r,g,b); \n"
|
||||
"} \n"
|
||||
"lowp float snoiseA() \n"
|
||||
"{ \n"
|
||||
" mediump vec2 texSize = vec2(640.0, 580.0); \n"
|
||||
// multiplier for higher res noise effect
|
||||
" lowp float mult = 1.0 + step(2.0, uScreenScale.x); \n"
|
||||
" \n"
|
||||
" mediump vec2 coord = mult * ((gl_FragCoord.xy)/uScreenScale/texSize);\n"
|
||||
" \n"
|
||||
// Only red channel of noise texture contains noise.
|
||||
" return texture(uTexNoise,coord).r; \n"
|
||||
"} \n"
|
||||
if (_glinfo.isGLES2)
|
||||
return;
|
||||
|
||||
m_part =
|
||||
"void colorNoiseDither(in lowp vec3 _noise, inout lowp vec3 _color)\n"
|
||||
"{ \n"
|
||||
" mediump vec3 threshold = 7.0 / 255.0 * (_noise - 0.5);\n"
|
||||
" _color = clamp(_color + threshold,0.0,1.0); \n"
|
||||
"} \n"
|
||||
"void alphaNoiseDither(in lowp float _noise, inout lowp float _alpha)\n"
|
||||
"{ \n"
|
||||
" mediump float threshold = 7.0 / 255.0 * (_noise - 0.5);\n"
|
||||
" _alpha = clamp(_alpha + threshold,0.0,1.0); \n"
|
||||
"} \n"
|
||||
"lowp vec3 snoiseRGB() \n"
|
||||
"{ \n"
|
||||
" mediump vec2 texSize = vec2(640.0, 580.0); \n"
|
||||
// multiplier for higher res noise effect
|
||||
" lowp float mult = 1.0 + step(2.0, uScreenScale.x); \n"
|
||||
" \n"
|
||||
" mediump vec2 coordR = mult * ((gl_FragCoord.xy)/uScreenScale/texSize);\n"
|
||||
" mediump vec2 coordG = mult * ((gl_FragCoord.xy + vec2( 0.0, texSize.y / 2.0 ))/uScreenScale/texSize);\n"
|
||||
" mediump vec2 coordB = mult * ((gl_FragCoord.xy + vec2( texSize.x / 2.0, 0.0))/uScreenScale/texSize);\n"
|
||||
" \n"
|
||||
// Only red channel of noise texture contains noise.
|
||||
" lowp float r = texture(uTexNoise,coordR).r; \n"
|
||||
" lowp float g = texture(uTexNoise,coordG).r; \n"
|
||||
" lowp float b = texture(uTexNoise,coordB).r; \n"
|
||||
" \n"
|
||||
" return vec3(r,g,b); \n"
|
||||
"} \n"
|
||||
"lowp float snoiseA() \n"
|
||||
"{ \n"
|
||||
" mediump vec2 texSize = vec2(640.0, 580.0); \n"
|
||||
// multiplier for higher res noise effect
|
||||
" lowp float mult = 1.0 + step(2.0, uScreenScale.x); \n"
|
||||
" \n"
|
||||
" mediump vec2 coord = mult * ((gl_FragCoord.xy)/uScreenScale/texSize);\n"
|
||||
" \n"
|
||||
// Only red channel of noise texture contains noise.
|
||||
" return texture(uTexNoise,coord).r; \n"
|
||||
"} \n"
|
||||
;
|
||||
|
||||
if (config.generalEmulation.enableDitheringQuantization != 0) {
|
||||
m_part +=
|
||||
"void quantizeRGB(inout lowp vec3 _color) \n"
|
||||
"{ \n"
|
||||
" _color.rgb = round(_color.rgb * 32.0)/32.0; \n"
|
||||
"} \n"
|
||||
"void quantizeA(inout lowp float _alpha) \n"
|
||||
"{ \n"
|
||||
" _alpha = round(_alpha * 32.0)/32.0; \n"
|
||||
"} \n"
|
||||
;
|
||||
} else {
|
||||
m_part +=
|
||||
"void quantizeRGB(inout lowp vec3 _color){}\n"
|
||||
"void quantizeA(inout lowp float _alpha){}\n"
|
||||
;
|
||||
if (config.generalEmulation.ditheringMode == Config::DitheringMode::dmNoiseWithQuant ||
|
||||
config.generalEmulation.ditheringMode == Config::DitheringMode::dmFullWithQuant) {
|
||||
m_part +=
|
||||
"void quantizeRGB(inout lowp vec3 _color)\n"
|
||||
"{ \n"
|
||||
" _color.rgb = round(_color.rgb * 32.0)/32.0; \n"
|
||||
"} \n"
|
||||
"void quantizeA(inout lowp float _alpha)\n"
|
||||
"{ \n"
|
||||
" _alpha = round(_alpha * 32.0)/32.0; \n"
|
||||
"} \n"
|
||||
;
|
||||
}
|
||||
else {
|
||||
m_part +=
|
||||
"void quantizeRGB(inout lowp vec3 _color){}\n"
|
||||
"void quantizeA(inout lowp float _alpha){}\n"
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace glsl {
|
|||
bool _saveCombinerKeys(const graphics::Combiners & _combiners) const;
|
||||
bool _loadFromCombinerKeys(graphics::Combiners & _combiners);
|
||||
|
||||
const u32 m_formatVersion = 0x2BU;
|
||||
const u32 m_formatVersion = 0x2CU;
|
||||
const u32 m_keysFormatVersion = 0x04;
|
||||
const opengl::GLInfo & m_glinfo;
|
||||
opengl::CachedUseProgram * m_useProgram;
|
||||
|
|
|
@ -67,9 +67,13 @@ bool Config_SetDefault()
|
|||
res = ConfigSetDefaultInt(g_configVideoGliden64, "MaxAnisotropy", config.texture.maxAnisotropy, "Max level of Anisotropic Filtering, 0 for off");
|
||||
assert(res == M64ERR_SUCCESS);
|
||||
//#Emulation Settings
|
||||
res = ConfigSetDefaultInt(g_configVideoGliden64, "DitheringMode", config.generalEmulation.ditheringMode, "Dithering mode. (0=disable, 1=noise dithering (default), 2=noise dithering with 5bit quantization, 3=full dithering, 4=full dithering with 5bit quantization)");
|
||||
res = ConfigSetDefaultBool(g_configVideoGliden64, "EnableDitheringPattern", config.generalEmulation.enableDitheringPattern, "Enable dithering pattern on output image.");
|
||||
assert(res == M64ERR_SUCCESS);
|
||||
res = ConfigSetDefaultInt(g_configVideoGliden64, "BufferDitheringMode", config.generalEmulation.bufferDitheringMode, "Dithering mode for buffer in RDRAM. (0=disable, 1=bayer, 2=magic square, 3=blue noise)");
|
||||
res = ConfigSetDefaultBool(g_configVideoGliden64, "EnableHiresNoiseDithering", config.generalEmulation.enableHiresNoiseDithering, "Enable hi-res noise dithering.");
|
||||
assert(res == M64ERR_SUCCESS);
|
||||
res = ConfigSetDefaultBool(g_configVideoGliden64, "DitheringQuantization", config.generalEmulation.enableDitheringQuantization, "Dither with color quantization.");
|
||||
assert(res == M64ERR_SUCCESS);
|
||||
res = ConfigSetDefaultInt(g_configVideoGliden64, "RDRAMImageDitheringMode", config.generalEmulation.rdramImageDitheringMode, "Dithering mode for image in RDRAM. (0=disable, 1=bayer, 2=magic square, 3=blue noise)");
|
||||
assert(res == M64ERR_SUCCESS);
|
||||
res = ConfigSetDefaultBool(g_configVideoGliden64, "EnableLOD", config.generalEmulation.enableLOD, "Enable LOD emulation.");
|
||||
assert(res == M64ERR_SUCCESS);
|
||||
|
@ -272,10 +276,14 @@ void Config_LoadCustomConfig()
|
|||
result = ConfigExternalGetParameter(fileHandle, sectionName, "texture\\screenShotFormat", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.texture.screenShotFormat = atoi(value);
|
||||
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\ditheringMode", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.ditheringMode = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\bufferDitheringMode", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.bufferDitheringMode = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\enableDitheringPattern", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.enableDitheringPattern = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\enableHiresNoiseDithering", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.enableHiresNoiseDithering = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\enableDitheringQuantization", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.enableDitheringQuantization = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\rdramImageDitheringMode", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.rdramImageDitheringMode = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\enableLOD", value, sizeof(value));
|
||||
if (result == M64ERR_SUCCESS) config.generalEmulation.enableLOD = atoi(value);
|
||||
result = ConfigExternalGetParameter(fileHandle, sectionName, "generalEmulation\\enableHWLighting", value, sizeof(value));
|
||||
|
@ -398,8 +406,11 @@ void Config_LoadConfig()
|
|||
config.texture.maxAnisotropy = ConfigGetParamInt(g_configVideoGliden64, "MaxAnisotropy");
|
||||
config.texture.enableHalosRemoval = ConfigGetParamBool(g_configVideoGliden64, "enableHalosRemoval");
|
||||
//#Emulation Settings
|
||||
config.generalEmulation.ditheringMode = ConfigGetParamInt(g_configVideoGliden64, "DitheringMode");
|
||||
config.generalEmulation.bufferDitheringMode = ConfigGetParamInt(g_configVideoGliden64, "BufferDitheringMode");
|
||||
config.generalEmulation.enableDitheringPattern = ConfigGetParamBool(g_configVideoGliden64, "EnableDitheringPattern");
|
||||
config.generalEmulation.enableHiresNoiseDithering = ConfigGetParamBool(g_configVideoGliden64, "EnableHiresNoiseDithering");
|
||||
config.generalEmulation.enableDitheringQuantization = ConfigGetParamBool(g_configVideoGliden64, "DitheringQuantization");
|
||||
config.generalEmulation.rdramImageDitheringMode = ConfigGetParamInt(g_configVideoGliden64, "RDRAMImageDitheringMode");
|
||||
|
||||
config.generalEmulation.enableLOD = ConfigGetParamBool(g_configVideoGliden64, "EnableLOD");
|
||||
config.generalEmulation.enableHWLighting = ConfigGetParamBool(g_configVideoGliden64, "EnableHWLighting");
|
||||
config.generalEmulation.enableShadersStorage = ConfigGetParamBool(g_configVideoGliden64, "EnableShadersStorage");
|
||||
|
|
Loading…
Reference in New Issue
Block a user