1
0
mirror of https://github.com/FunkyFr3sh/cnc-ddraw.git synced 2025-03-25 01:57:47 +01:00

add option to select built-in opengl shaders

This commit is contained in:
FunkyFr3sh 2023-08-26 21:28:53 +02:00
parent 62bb150c71
commit e9f1023a31
4 changed files with 67 additions and 32 deletions

View File

@ -778,14 +778,25 @@ void __fastcall TConfigForm::FormCreate(TObject *Sender)
for (int i = 0; i < list.Length; i++) for (int i = 0; i < list.Length; i++)
ShaderCbx->AddItem(list[i], NULL); ShaderCbx->AddItem(list[i], NULL);
auto shader = ini->ReadString("ddraw", "shader", "");
ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader);
} }
catch (...) catch (...)
{ {
} }
if (ShaderCbx->Items->Count == 0) {
ShaderCbx->AddItem("Nearest neighbor", NULL);
ShaderCbx->AddItem("Bilinear", NULL);
ShaderCbx->AddItem("Bicubic", NULL);
}
auto shader = ini->ReadString("ddraw", "shader", "Bicubic");
ShaderCbx->ItemIndex = ShaderCbx->Items->IndexOf(shader);
if (ShaderCbx->ItemIndex == -1) {
ShaderCbx->AddItem(shader, NULL);
ShaderCbx->ItemIndex = ShaderCbx->Items->Count - 1;
}
int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2); int d3d9_filter = ini->ReadInteger("ddraw", "d3d9_filter", 2);
switch (d3d9_filter) { switch (d3d9_filter) {

View File

@ -15,25 +15,25 @@ const char PASSTHROUGH_VERT_SHADER_110[] =
const char PALETTE_FRAG_SHADER_110[] = const char PALETTE_FRAG_SHADER_110[] =
"#version 110\n" "#version 110\n"
"uniform sampler2D SurfaceTex; \n" "uniform sampler2D Texture; \n"
"uniform sampler2D PaletteTex; \n" "uniform sampler2D PaletteTexture; \n"
"varying vec2 TEX0; \n" "varying vec2 TEX0; \n"
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 pIndex = texture2D(SurfaceTex, TEX0); \n" " vec4 pIndex = texture2D(Texture, TEX0); \n"
" gl_FragColor = texture2D(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n" " gl_FragColor = texture2D(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0)); \n"
"}\n"; "}\n";
const char PASSTHROUGH_FRAG_SHADER_110[] = const char PASSTHROUGH_FRAG_SHADER_110[] =
"#version 110\n" "#version 110\n"
"uniform sampler2D SurfaceTex; \n" "uniform sampler2D Texture; \n"
"varying vec2 TEX0; \n" "varying vec2 TEX0; \n"
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 texel = texture2D(SurfaceTex, TEX0); \n" " vec4 texel = texture2D(Texture, TEX0); \n"
" gl_FragColor = texel; \n" " gl_FragColor = texel; \n"
"}\n"; "}\n";
@ -59,26 +59,26 @@ const char PASSTHROUGH_VERT_SHADER[] =
const char PALETTE_FRAG_SHADER[] = const char PALETTE_FRAG_SHADER[] =
"#version 130\n" "#version 130\n"
"out vec4 FragColor;\n" "out vec4 FragColor;\n"
"uniform sampler2D SurfaceTex;\n" "uniform sampler2D Texture;\n"
"uniform sampler2D PaletteTex;\n" "uniform sampler2D PaletteTexture;\n"
"in vec4 TEX0;\n" "in vec4 TEX0;\n"
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n" " vec4 pIndex = texture(Texture, TEX0.xy);\n"
" FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" " FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n"
"}\n"; "}\n";
const char PASSTHROUGH_FRAG_SHADER[] = const char PASSTHROUGH_FRAG_SHADER[] =
"#version 130\n" "#version 130\n"
"out vec4 FragColor;\n" "out vec4 FragColor;\n"
"uniform sampler2D SurfaceTex;\n" "uniform sampler2D Texture;\n"
"in vec4 TEX0;\n" "in vec4 TEX0;\n"
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 texel = texture(SurfaceTex, TEX0.xy);\n" " vec4 texel = texture(Texture, TEX0.xy);\n"
" FragColor = texel;\n" " FragColor = texel;\n"
"}\n"; "}\n";
@ -104,26 +104,26 @@ const char PASSTHROUGH_VERT_SHADER_CORE[] =
const char PALETTE_FRAG_SHADER_CORE[] = const char PALETTE_FRAG_SHADER_CORE[] =
"#version 150\n" "#version 150\n"
"out vec4 FragColor;\n" "out vec4 FragColor;\n"
"uniform sampler2D SurfaceTex;\n" "uniform sampler2D Texture;\n"
"uniform sampler2D PaletteTex;\n" "uniform sampler2D PaletteTexture;\n"
"in vec4 TEX0;\n" "in vec4 TEX0;\n"
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 pIndex = texture(SurfaceTex, TEX0.xy);\n" " vec4 pIndex = texture(Texture, TEX0.xy);\n"
" FragColor = texture(PaletteTex, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n" " FragColor = texture(PaletteTexture, vec2(pIndex.r * (255.0/256.0) + (0.5/256.0), 0));\n"
"}\n"; "}\n";
const char PASSTHROUGH_FRAG_SHADER_CORE[] = const char PASSTHROUGH_FRAG_SHADER_CORE[] =
"#version 150\n" "#version 150\n"
"out vec4 FragColor;\n" "out vec4 FragColor;\n"
"uniform sampler2D SurfaceTex;\n" "uniform sampler2D Texture;\n"
"in vec4 TEX0;\n" "in vec4 TEX0;\n"
"\n" "\n"
"void main()\n" "void main()\n"
"{\n" "{\n"
" vec4 texel = texture(SurfaceTex, TEX0.xy);\n" " vec4 texel = texture(Texture, TEX0.xy);\n"
" FragColor = texel;\n" " FragColor = texel;\n"
"}\n"; "}\n";

View File

@ -275,7 +275,8 @@ static void cfg_create_ini()
"\n" "\n"
"; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n" "; Preliminary libretro shader support - (Requires 'renderer=opengl*') https://github.com/libretro/glsl-shaders\n"
"; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n" "; 2x scaling example: https://imgur.com/a/kxsM1oY - 4x scaling example: https://imgur.com/a/wjrhpFV\n"
"; Note: Defauls to Bicubic Catmull-Rom if no shader specified or file was not found\n" "; You can specify a full path to a .glsl shader file here or use one of the values listed below\n"
"; Possible values: Nearest neighbor, Bilinear, Bicubic\n"
"shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n" "shader=Shaders\\cubic\\catmull-rom-bilinear.glsl\n"
"\n" "\n"
"; Window position, -32000 = center to screen\n" "; Window position, -32000 = center to screen\n"

View File

@ -185,15 +185,24 @@ static void ogl_build_programs()
(g_ddraw->render.viewport.width != g_ddraw->width || (g_ddraw->render.viewport.width != g_ddraw->width ||
g_ddraw->render.viewport.height != g_ddraw->height)) g_ddraw->render.viewport.height != g_ddraw->height))
{ {
g_ogl.scale_program = oglu_build_program(PASSTHROUGH_VERT_SHADER, CATMULL_ROM_FRAG_SHADER); g_ogl.scale_program =
oglu_build_program(
PASSTHROUGH_VERT_SHADER,
_stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER :
_stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER :
CATMULL_ROM_FRAG_SHADER);
if (!g_ogl.scale_program) if (!g_ogl.scale_program)
{ {
g_ogl.scale_program = g_ogl.scale_program =
oglu_build_program(PASSTHROUGH_VERT_SHADER_CORE, CATMULL_ROM_FRAG_SHADER_CORE); oglu_build_program(
PASSTHROUGH_VERT_SHADER_CORE,
_stricmp(g_ddraw->shader, "Nearest neighbor") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE :
_stricmp(g_ddraw->shader, "Bilinear") == 0 ? PASSTHROUGH_FRAG_SHADER_CORE :
CATMULL_ROM_FRAG_SHADER_CORE);
} }
bilinear = TRUE; bilinear = _stricmp(g_ddraw->shader, "Nearest neighbor") != 0;
} }
} }
} }
@ -365,10 +374,10 @@ static void ogl_init_main_program()
glUseProgram(g_ogl.main_program); glUseProgram(g_ogl.main_program);
glUniform1i(glGetUniformLocation(g_ogl.main_program, "SurfaceTex"), 0); glUniform1i(glGetUniformLocation(g_ogl.main_program, "Texture"), 0);
if (g_ddraw->bpp == 8) if (g_ddraw->bpp == 8)
glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTex"), 1); glUniform1i(glGetUniformLocation(g_ogl.main_program, "PaletteTexture"), 1);
if (g_oglu_got_version3) if (g_oglu_got_version3)
{ {
@ -521,11 +530,25 @@ static void ogl_init_scale_program()
output_size[0] = (float)g_ddraw->render.viewport.width; output_size[0] = (float)g_ddraw->render.viewport.width;
output_size[1] = (float)g_ddraw->render.viewport.height; output_size[1] = (float)g_ddraw->render.viewport.height;
glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "OutputSize"), 1, output_size); GLint loc = glGetUniformLocation(g_ogl.scale_program, "OutputSize");
glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "TextureSize"), 1, texture_size); if (loc != -1)
glUniform2fv(glGetUniformLocation(g_ogl.scale_program, "InputSize"), 1, input_size); glUniform2fv(loc, 1, output_size);
glUniform1i(glGetUniformLocation(g_ogl.scale_program, "FrameDirection"), 1);
glUniform1i(glGetUniformLocation(g_ogl.scale_program, "Texture"), 0); loc = glGetUniformLocation(g_ogl.scale_program, "TextureSize");
if (loc != -1)
glUniform2fv(loc, 1, texture_size);
loc = glGetUniformLocation(g_ogl.scale_program, "InputSize");
if (loc != -1)
glUniform2fv(loc, 1, input_size);
loc = glGetUniformLocation(g_ogl.scale_program, "FrameDirection");
if (loc != -1)
glUniform1i(loc, 1);
loc = glGetUniformLocation(g_ogl.scale_program, "Texture");
if (loc != -1)
glUniform1i(loc, 0);
const float mvp_matrix[16] = { const float mvp_matrix[16] = {
1,0,0,0, 1,0,0,0,