1
0
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:
Sergey Lipskiy 2020-03-28 18:42:50 +07:00
parent 2600a6bc90
commit 897fc35d51
10 changed files with 203 additions and 187 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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>

View File

@ -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);

View File

@ -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"
;
}
}
}
}
};

View File

@ -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;

View File

@ -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");